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

JDBC 세이브포인트(Savepoint)란? 트랜잭션 부분 롤백 완벽 가이드

JDBC 세이브포인트(Savepoint)란?

세이브포인트(Savepoint) 인터페이스는 트랜잭션에 대한 추가적인 제어 기능을 제공합니다. 대부분의 최신 DBMS는 Oracle의 PL/SQL처럼 자체 환경 안에서 세이브포인트를 지원합니다.

세이브포인트를 설정하면 트랜잭션 내부에 논리적인 롤백 지점을 정의하게 됩니다. 따라서 세이브포인트 이후에 오류가 발생했을 때, rollback 메서드를 사용하여 모든 변경 사항을 되돌릴 수도 있고, 세이브포인트 이후의 변경 사항만 선택적으로 되돌릴 수도 있습니다.

세이브포인트 관리 주요 메서드

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

  • setSavepoint(String savepointName): 새로운 세이브포인트를 정의하고, 생성된 Savepoint 객체를 반환합니다.

  • releaseSavepoint(Savepoint savepointName): 지정한 세이브포인트를 삭제합니다. 매개변수로 Savepoint 객체가 필요하며, 이 객체는 일반적으로 setSavepoint() 메서드로 생성된 것입니다.

그리고 rollback(String savepointName) 메서드도 함께 제공되는데, 이 메서드는 현재 작업을 지정된 세이브포인트 시점까지만 롤백합니다.

예제 코드

try {
    // 유효한 Connection 객체 conn이 있다고 가정
    conn.setAutoCommit(false);
    Statement stmt = conn.createStatement();

    // 세이브포인트 설정
    Savepoint savepoint1 = conn.setSavepoint("Savepoint1");

    // 정상적인 INSERT 문 실행
    String sql1 = "INSERT INTO Employees VALUES (106, 20, 'Rita', 'Tez')";
    stmt.executeUpdate(sql1);

    // 문법 오류가 있는 잘못된 SQL 문 실행
    String sql2 = "INSERTED IN Employees VALUES (107, 22, 'Sita', 'Tez')";
    stmt.executeUpdate(sql2);

    // 오류가 없다면 변경 사항 커밋
    conn.commit();
} catch(SQLException se){
    // 오류 발생 시 세이브포인트 지점까지 롤백
    conn.rollback(savepoint1);
}

예제 동작 방식 설명

위 예제의 흐름은 다음과 같습니다.

  1. 자동 커밋 비활성화: setAutoCommit(false)를 호출하여 트랜잭션을 수동으로 관리합니다.

  2. 세이브포인트 생성: setSavepoint("Savepoint1")로 롤백 기준점을 만듭니다.

  3. 첫 번째 INSERT 실행: Employees 테이블에 정상적으로 데이터가 삽입됩니다.

  4. 두 번째 INSERT 실행: 'INSERTED IN'이라는 잘못된 문법 때문에 SQLException이 발생합니다.

  5. 롤백 처리: catch 블록에서 rollback(savepoint1)을 호출하면, 첫 번째 INSERT 작업까지 되돌려지고 데이터베이스는 세이브포인트 시점의 상태로 복구됩니다.

이처럼 세이브포인트를 활용하면 대용량 트랜잭션이나 여러 단계로 구성된 데이터 처리 작업에서, 전체를 처음부터 다시 실행하지 않고도 특정 지점부터 유연하게 오류를 복구할 수 있습니다.