保持可能性の使用
既定では、トランザクション内で作成される結果セットは、トランザクションがデータベースにコミットされた後、またはロールバックされるときに開かれたままになります。 ただし、トランザクションがコミットされた後で結果セットを閉じると便利な場合があります。 このため、SQL Server 用 Microsoft JDBC ドライバーは結果セットの保持機能をサポートしています。
結果セットの保持機能は、SQLServerConnection クラスの setHoldability メソッドを使用して設定できます。 setHoldability メソッドを使用して保持機能を設定する場合、結果セット保持機能の定数である ResultSet.HOLD_CURSORS_OVER_COMMIT
または ResultSet.CLOSE_CURSORS_AT_COMMIT
を使用できます。
JDBC ドライバーも、Statement オブジェクトのいずれか 1 つを作成する場合に、保持機能の設定をサポートします。 結果セットの保持機能パラメーターがあるオーバーロードを持つ Statement オブジェクトを作成する場合、ステートメント オブジェクトの保持機能が接続の保持機能と一致する必要があります。 両者が一致しない場合、例外がスローされます。 これは、SQL Server では接続レベルのみで保持機能がサポートされるためです。
結果セットの保持機能は、結果セットがサーバー側のカーソル専用に作成されている場合にその結果セットと関連付けられる SQLServerConnection オブジェクトの保持機能です。 クライアント側のカーソルには適用されません。 クライアント側のカーソルがあるすべての結果セットの保持機能の値は、常に ResultSet.HOLD_CURSORS_OVER_COMMIT
です。
サーバー側のカーソルについては、SQL Server 2005 以降に接続されている場合に、保持機能の設定が、その接続でこれから作成される新しい結果セットの保持機能にのみ影響を与えます。 つまり、保持機能を設定しても、以前に作成され、その接続で既に開かれている結果セットの保持機能には影響しません。
次の例では、結果セットの保持機能は、try
ブロック内の 2 つの個別のステートメントで構成されるローカル トランザクションの実行時に設定されます。 このステートメントは、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();
}
}
}