유지 기능 사용
기본적으로 트랜잭션 내에서 생성된 결과 집합은 트랜잭션이 데이터베이스에 커밋된 후, 또는 롤백될 때 열린 상태로 유지됩니다. 그러나 트랜잭션이 커밋된 후 결과 집합을 닫으면 유용한 경우가 있습니다. 이를 위해 SQL Server용 Microsoft JDBC Driver는 결과 집합 유지 기능을 사용하도록 지원합니다.
결과 집합 보존성은 SQLServerConnection 클래스의 setHoldability 메서드를 사용하여 설정할 수 있습니다. setHoldability 메서드를 사용하여 유지 기능을 설정할 때 결과 집합 유지 기능 ResultSet.HOLD_CURSORS_OVER_COMMIT
또는 ResultSet.CLOSE_CURSORS_AT_COMMIT
상수를 사용할 수 있습니다.
JDBC 드라이버는 Statement 개체 중 하나를 만들 때에도 유지 기능 설정을 지원합니다. 결과 집합 유지 기능 매개 변수를 사용하여 오버로드가 있는 Statement 개체를 만들 때, 문 개체의 유지 기능은 연결의 유지 기능과 일치해야 합니다. 일치하지 않으면 예외가 발생합니다. SQL Server는 연결 수준에서만 유지 기능을 지원하기 때문입니다.
결과 집합의 유지 기능이란 서버측 커서에 대해서만 결과 집합을 만들 때 해당 결과 집합에 연결되는 SQLServerConnection 개체의 유지 기능입니다. 클라이언트 쪽 커서에는 적용되지 않습니다. 클라이언트 쪽 커서가 있는 모든 결과 집합의 유지 기능 값은 항상 ResultSet.HOLD_CURSORS_OVER_COMMIT
입니다.
서버 커서의 경우 SQL Server 2005 이상에 연결된 경우, 유지 기능을 설정하면 해당 연결에서 아직 만들어지지 않은 새 결과 집합의 유지 기능에만 영향을 미칩니다. 즉, 유지 기능을 설정하더라도 이전에 생성되어 해당 연결에서 이미 열려 있는 결과 집합의 유지 기능에는 영향을 주지 않습니다.
다음 예제에서는 try
블록에서 두 개의 개별 문으로 구성된 로컬 트랜잭션을 수행하는 동안 결과 집합에 유지 기능이 설정되어 있습니다. 문은 AdventureWorks2022 샘플 데이터베이스의 Production.ScrapReason 테이블에 대해 실행됩니다. 먼저 자동 커밋을 false
로 설정하여 수동 트랜잭션 모드로 전환하는 예제입니다. 자동 커밋 모드를 사용하지 않도록 설정하면, 응용 프로그램에서 commit 메서드를 명시적으로 호출할 때까지 SQL 문은 커밋되지 않습니다. catch 블록의 코드는 예외가 발생하는 경우 트랜잭션을 롤백합니다.
public static void executeTransaction(Connection con) {
try (Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);) {
con.setAutoCommit(false);
con.setHoldability(ResultSet.HOLD_CURSORS_OVER_COMMIT);
stmt.executeUpdate("INSERT INTO Production.ScrapReason(Name) VALUES('Bad part')");
ResultSet rs = stmt.executeQuery("SELECT * FROM Production.ScrapReason");
con.commit();
System.out.println("Transaction succeeded.");
// Display results.
while (rs.next()) {
System.out.println(rs.getString(2));
}
}
catch (SQLException ex) {
ex.printStackTrace();
try {
System.out.println("Transaction failed.");
con.rollback();
}
catch (SQLException se) {
se.printStackTrace();
}
}
}