[JDBC] Transactions 사용법

JDBC 연결이 자동 커밋 모드인 경우 기본적으로 각 SQL 문이 완료되면 데이터베이스에 커밋됩니다.

간단한 애플리케이션에서는 괜찮지만 자동이 아닌 수동으로 트랜잭션을 직접 관리하는 이유는 3가지 있습니다.

  • 성능 향상
  • 무결성 유지
  • 분산 트랜잭션 사용

트랜잭션을 사용하면 데이터베이스에 변경 사항이 적용되는 시점과 여부를 제어할 수 있습니다. 이는 하나의 SQL 문 또는 그룹의 SQL 문을 하나의 노리적 단위로 처리하며, 어떤 문에서든 오류가 발생하면 전체 트랜잭션이 실패합니다.

JDBC 드라이버가 기본적으로 사용하는 자동 커밋 모드 대신 수동 트랜잭션 지원을 활성화하려면 Connection 객체의 setAutoCommit() 메서드를 사용하여 false로 파라미터를 전달합니다.

conn.setAutoCommit(false);

커밋 및 롤백

변경 작업이 완료되었고 변경 사항을 커밋하려면 Connection 객체에서 commit() 메서드를 호출합니다.

conn.commit();

반면 conn이라는 Connection 객체를 사용하여 데이터베이스에 대한 업데이트를 롤백할수있습니다.

conn.rollback();
try {
   // 유효한 Connection 객체 conn을 가정
   conn.setAutoCommit(false);
   Statement stmt = conn.createStatement();
   
   String SQL = "INSERT INTO Employees VALUES (106, 20, 'Rita', 'Tez')";
   stmt.executeUpdate(SQL);  
   
   // 오류가 있는 SQL 문 제출
   String SQL = "INSERTED IN Employees VALUES (107, 22, 'Sita', 'Singh')";
   stmt.executeUpdate(SQL);
   
   // 오류가 없으면 커밋
   conn.commit();
} catch(SQLException se) {
   // 오류가 있으면 롤백
   conn.rollback();
}

세이브포인트 사용

새로운 JDBC 3.0 Savepoint 인터페이스는 추가적인 트랜잭션 제어를 제공합니다.

세이브포인트를 설정하면 트랜잭션 내에서 논리적 롤백 지점을 정의합니다. 세이브포인트 이후에 오류가 발생하면 rollback 메서드를 사용하여 모든 변경 사항 또는 세이브포인트 이후의 변경 사항만 되돌릴 수 있습니다.

Connection 객체에는 세이브포인트를 관리하는데 도움이 되는 두 가지 메서드가 있습니다.

  • setSavepoint(String savepointName) : 새로운 세이브포인트를 정의합니다. 세이브 포인트 객체도 반환합니다.
  • releaseSavepoint(Savepoint savepointName) : 세이브포인트를 삭제합니다. 이 메서드는 매개변수로 세이브포인트 객체를 필요로 합니다. 이 객체는 보통 setSavepoint() 메서드로 생성된 세이브 포인트입니다.

rollback(String savepointName) 메서드는 지정된 세이브 포인트까지 작업을 롤백합니다.

try {
   // 유효한 Connection 객체 conn을 가정
   conn.setAutoCommit(false);
   Statement stmt = conn.createStatement();
   
   // 세이브포인트 설정
   Savepoint savepoint1 = conn.setSavepoint("Savepoint1");
   String SQL = "INSERT INTO Employees VALUES (106, 20, 'Rita', 'Tez')";
   stmt.executeUpdate(SQL);  
   
   // 오류가 있는 SQL 문 제출
   String SQL = "INSERTED IN Employees VALUES (107, 22, 'Sita', 'Tez')";
   stmt.executeUpdate(SQL);
   
   // 오류가 없으면 변경 사항 커밋
   conn.commit();
} catch(SQLException se) {
   // 오류가 있으면 세이브포인트까지 롤백
   conn.rollback(savepoint1);
}

'Databases > JDBC' 카테고리의 다른 글

[JDBC] Batch Processing(일괄 처리)  (0) 2024.07.08
[JDBC] 예외 처리  (0) 2024.07.08
[JDBC] Data Types  (0) 2024.07.05
[JDBC] ResultSet란  (0) 2024.07.05
[JDBC] Statements, PreparedStatement and CallableStatement  (0) 2024.07.05