JDBC 애플리케이션의 세이브포인트

SQL 세이브포인트는 작업 단위(UOW) 내의 특정 시점에서 데이터 및 스키마의 상태를 나타냅니다. SQL문을 사용하여 세이브포인트를 설정하고 세이브포인트를 릴리스하며 세이브포인트가 나타내는 상태로 데이터 및 스키마를 복원할 수 있습니다.

IBM® Data Server Driver for JDBC and SQLJ 는 세이브포인트 사용을 위해 다음 메소드를 지원합니다.
Connection.setSavepoint() or Connection.setSavepoint(String name)
세이브포인트를 설정합니다. 이러한 메소드는 이후의 releaseSavepoint 또는 rollback 조작에서 사용되는 Savepoint 오브젝트를 리턴합니다.

이러한 메소드 중 하나를 실행할 때 데이터 서버는 ON ROLLBACK RETAIN CURSORS가 포함된 SAVEPOINT문의 양식을 실행합니다.

Connection.releaseSavepoint(Savepoint savepoint)
지정된 세이브포인트 및 이후에 설정된 모든 세이브포인트를 릴리스합니다.
Connection.rollback(Savepoint savepoint)
지정된 세이브포인트로 작업을 롤백합니다.
DatabaseMetaData.supportsSavepoints()
데이터 소스가 세이브포인트를 지원하는지를 표시합니다.

메소드 DB2Connection.setSavePointUniqueOption을 호출하여 세이브포인트가 고유한지를 표시할 수 있습니다. 이 메소드를 true 값으로 호출하는 경우, 애플리케이션은 동일한 복구 단위 내에서 동일한 이름의 세이브포인트를 두 개 이상 설정할 수 없습니다. 이 메소드를 false(기본값) 값으로 호출하는 경우 동일한 복구 단위 내에서 동일한 이름의 다중 세이브포인트를 작성할 수 있지만 세이브포인트 작성은 이전에 작성된 세이브포인트를 동일한 이름으로 삭제합니다.

다음 예에서는 세이브포인트를 설정하고 세이브포인트로 롤백하며 세이브포인트를 릴리스하는 방법을 설명합니다.
그림 1. JDBC 애플리케이션에서 세이브포인트 설정, 롤백, 릴리스
Connection con;
Statement stmt;
ResultSet rs;
String empNumVar;
int shoeSizeVar;
…
con.setAutoCommit(false);                    // set autocommit OFF
stmt = con.createStatement();                // Create a Statement object
…                                            // Perform some SQL
con.commit();                                // Commit the transaction
stmt.executeUpdate("INSERT INTO EMP_SHOE " +
  "VALUES ('000010', 6)");                   // Insert a row
((com.ibm.db2.jcc.DB2Connection)con).setSavePointUniqueOption(true);
                                             // Indicate that savepoints
                                             // are unique within a unit
                                             // of recovery
Savepoint savept = con.setSavepoint("savepoint1"); 
                                             // Create a savepoint
…
stmt.executeUpdate("INSERT INTO EMP_SHOE " +
  "VALUES ('000020', 10)");                  // Insert another row
conn.rollback(savept);                       // Roll back work to the point
                                             //  after the first insert
…
con.releaseSavepoint(savept);                // Release the savepoint
stmt.close();                                // Close the Statement
conn.commit();                               // Commit the transaction