저장점 사용
저장점은 트랜잭션 일부를 롤백하는 메커니즘을 제공합니다. SQL Server에서는 SAVE TRANSACTION savepoint_name 문을 사용하여 저장점을 만들 수 있습니다. 나중에 트랜잭션의 시작 지점으로 롤백하는 대신 저장점으로 롤백하려면 ROLLBACK TRANSACTION savepoint_name 문을 실행합니다.
저장점은 오류가 발생할 가능성이 거의 없는 경우에 유용합니다. 자주 오류가 발생한 경우 저장점을 사용하여 트랜잭션의 일부를 롤백하는 것이 업데이트를 만들기 전에 각 트랜잭션을 테스트하여 업데이트가 유효한지 확인하는 것보다 더 효율적일 수 있습니다. 업데이트와 롤백은 비용이 많이 드는 작업이므로 저장점은 오류가 발생할 가능성이 적고 업데이트 전에 미리 유효성을 검사하는 데 비교적 비용이 많이 드는 경우에만 효과적입니다.
Microsoft JDBC Driver for SQL Server는 SQLServerConnection 클래스의 setSavepoint 메서드를 통해 저장점을 사용할 수 있도록 지원합니다. setSavepoint 메서드를 사용하여 현재 트랜잭션 내에서 명명되었거나 명명되지 않은 저장점을 만들 수 있으며, 메서드에서는 SQLServerSavepoint 개체가 반환됩니다. 트랜잭션에 저장점을 여러 개 만들 수 있습니다. 지정된 저장점에 트랜잭션을 롤백하려면 SQLServerSavepoint 개체를 rollback (java.sql.Savepoint) 메서드에 전달하면 됩니다.
다음 예제에서는 try
블록에서 두 개의 개별 명령문으로 구성된 로컬 트랜잭션을 수행하는 과정에 저장점을 사용합니다. AdventureWorks2022 샘플 데이터베이스에 있는 Production.ScrapReason 테이블에 이러한 문이 실행되며 저장점은 두 번째 명령문을 롤백하는 데 사용됩니다. 그 결과, 첫 번째 문만 데이터베이스에 커밋됩니다.
public static void executeTransaction(Connection con) {
try(Statement stmt = con.createStatement();) {
con.setAutoCommit(false);
stmt.executeUpdate("INSERT INTO Production.ScrapReason(Name) VALUES('Correct width')");
Savepoint save = con.setSavepoint();
stmt.executeUpdate("INSERT INTO Production.ScrapReason(Name) VALUES('Wrong width')");
con.rollback(save);
con.commit();
System.out.println("Transaction succeeded.");
}
catch (SQLException ex) {
ex.printStackTrace();
try {
System.out.println("Transaction failed.");
con.rollback();
}
catch (SQLException se) {
se.printStackTrace();
}
}
}