Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

JDBC setAutoCommit() 메소드란? 트랜잭션 자동 커밋 제어 방법

트랜잭션과 커밋(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()으로 일괄 반영함으로써 데이터 무결성을 안전하게 보장할 수 있습니다.