트랜잭션과 커밋(Commit)의 기본 개념
데이터베이스에서 커밋(commit)을 수행하면 그 시점까지 진행된 모든 변경 사항이 영구적으로 저장됩니다.
JDBC에서는 commit() 메소드를 호출하여 데이터베이스 변경 사항을 저장할 수 있으며, 작업 중 문제가 발생하면 rollback() 메소드를 사용해 마지막 커밋 시점으로 되돌릴 수 있습니다.
기본적으로 많은 데이터베이스는 SQL 문이 실행될 때마다 자동으로 커밋(auto-commit)을 수행합니다. 하지만 트랜잭션을 직접 관리해야 하는 경우에는 이러한 자동 커밋 동작을 비활성화하고, 원하는 시점에 수동으로 커밋해야 합니다.
setAutoCommit() 메소드의 역할
이런 상황에서 사용되는 것이 바로 setAutoCommit() 메소드입니다. 이 메소드는 Connection 인터페이스에 정의되어 있으며, 하나의 boolean 값을 매개변수로 받습니다.
- true를 전달하면 데이터베이스의 자동 커밋 기능이 활성화됩니다.
- false를 전달하면 자동 커밋 기능이 비활성화되며, 이후
commit()메소드를 명시적으로 호출해야 변경 사항이 저장됩니다.
다음과 같이 자동 커밋 기능을 끌 수 있습니다.
Con.setAutoCommit(false);
실전 예제: 배치 처리와 함께 사용하기
아래 프로그램은 배치(batch) 처리를 통해 여러 레코드를 한 번에 삽입하는 예제입니다. 먼저 자동 커밋을 false로 설정한 뒤, 실행할 INSERT 문들을 배치에 추가하고, 배치를 실행한 후 마지막에 직접 commit()을 호출하여 변경 사항을 저장합니다.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class BatchProcessing_Statement {
public static void main(String args[])throws Exception {
// 연결 생성
String mysqlUrl = "jdbc:mysql://localhost/sampleDB";
Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
System.out.println("Connection established......");
// CREATE TABLE Dispatches( Product_Name VARCHAR(255), Name_Of_Customer
VARCHAR(255), Month_Of_Dispatch VARCHAR(255), Price INT, Location VARCHAR(255));
// Statement 객체 생성
Statement stmt = con.createStatement();
// 자동 커밋 비활성화
con.setAutoCommit(false);
// 레코드 삽입용 SQL 문
String insert1 = "INSERT INTO Dispatches( Product_Name , Name_Of_Customer , "
+ "Month_Of_Dispatch , Price, Location) VALUES "
+ "('KeyBoard', 'Amith', 'January', 1000, 'hyderabad')";
String insert2 = "INSERT INTO Dispatches( Product_Name , Name_Of_Customer , "
+ "Month_Of_Dispatch , Price, Location) VALUES "
+ "('Earphones', 'SUMITH', 'March', 500, 'Vishakhapatnam')";
String insert3 = "INSERT INTO Dispatches( Product_Name , Name_Of_Customer , "
+ "Month_Of_Dispatch , Price, Location) VALUES "
+ "('Mouse', 'Sudha', 'September', 200, 'Vijayawada')";
// 배치에 SQL 문 추가
stmt.addBatch(insert1);
stmt.addBatch(insert2);
stmt.addBatch(insert3);
// 배치 실행
stmt.executeBatch();
// 변경 사항 저장
con.commit();
System.out.println("Records inserted......");
}
}실행 결과
Connection established...... Records inserted......
정리
setAutoCommit(false)를 사용하면 여러 SQL 문을 하나의 트랜잭션으로 묶어 처리할 수 있습니다. 배치 처리처럼 다수의 작업을 원자적으로 수행해야 하는 경우, 중간에 오류가 발생하면 rollback()으로 전체를 되돌리고, 모든 작업이 성공했을 때만 commit()으로 일괄 반영함으로써 데이터 무결성을 안전하게 보장할 수 있습니다.