Java에서 Oracle 접속 시 "Could not commit with auto-commit set on" 오류 해결 방법
Java 애플리케이션에서 Oracle DB에 접속하여 데이터를 처리하는 과정에서 다음과 같은 오류를 만날 수 있습니다.
java.sql.SQLException: Could not commit with auto-commit set on
이 오류는 대부분 JDBC의 Auto Commit 설정과 관련이 있습니다.
오류 원인
JDBC에서는 기본적으로 Auto Commit이 활성화(true)되어 있는 경우가 많습니다. Auto Commit이 활성화된 상태에서는 SQL 실행 후 자동으로 Commit이 수행됩니다.
그런데 개발자가 별도로 commit()을 호출하면 다음과 같은 오류가 발생할 수 있습니다.
Connection conn = DriverManager.getConnection(url, id, pw);
System.out.println(conn.getAutoCommit()); // true
// SQL 처리
conn.commit(); // 예외 발생 가능
즉, 이미 자동으로 Commit이 수행되고 있는데 다시 Commit을 요청했기 때문에 발생하는 문제입니다.
잘못된 예제
conn.setAutoCommit(true);
// INSERT, UPDATE 수행
conn.commit(); // Could not commit with auto-commit set on
해결 방법 1. commit() 제거
트랜잭션을 직접 관리할 필요가 없다면 Auto Commit을 그대로 사용하고 명시적인 commit() 호출을 제거하면 됩니다.
conn.setAutoCommit(true);
// SQL 수행
// conn.commit(); 제거
해결 방법 2. 수동 트랜잭션 관리
여러 개의 SQL을 하나의 트랜잭션으로 관리해야 한다면 Auto Commit을 비활성화해야 합니다.
conn.setAutoCommit(false);
try {
// SQL 수행
conn.commit();
} catch (Exception e) {
conn.rollback();
}
이 경우 개발자가 직접 Commit과 Rollback을 제어할 수 있습니다.
원인 확인 방법
오류가 발생하는 위치 직전에 Auto Commit 상태를 확인해보는 것이 좋습니다.
System.out.println("AutoCommit = " + conn.getAutoCommit());
결과가 true인데 conn.commit()을 호출하고 있다면 해당 오류의 원인일 가능성이 매우 높습니다.
Spring 환경에서는?
Spring Framework에서 @Transactional을 사용하는 경우에는 트랜잭션을 Spring이 관리합니다.
따라서 서비스 코드에서 직접 commit()이나 rollback()을 호출하면 예상치 못한 오류가 발생할 수 있습니다.
이 경우에는 Spring의 트랜잭션 관리 기능에 맡기는 것이 올바른 방법입니다.
정리
- Auto Commit이 true인 상태에서
commit()호출 시 오류가 발생할 수 있다. - 자동 커밋을 사용할 경우
commit()을 제거한다. - 직접 트랜잭션을 관리하려면
setAutoCommit(false)를 설정한다. - Spring의
@Transactional사용 시에는 직접 Commit을 호출하지 않는다.
"Could not commit with auto-commit set on" 오류가 발생하면 가장 먼저 conn.getAutoCommit() 값을 확인하는 것이 문제 해결의 출발점이다.
댓글 없음:
댓글 쓰기