2026/11/07

오늘의 이야기

Java에서 Oracle 접속 시 "Could not commit with auto-commit set on" 오류 해결 방법


oracle 오류



 


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() 값을 확인하는 것이 문제 해결의 출발점이다.





댓글 없음:

댓글 쓰기

오늘의 이야기

Java에서 Oracle 접속 시 "Could not commit with auto-commit set on" 오류 해결 방법 oracle 오류   Java 애플리케이션에서 Or...