預設情況下,在交易內建立的結果集會在交易提交至資料庫後,或在交易復原時保持開啟。 不過,有時候在已經認可交易之後,讓結果集關閉會很有用。 為了達到此目的,Microsoft JDBC Driver for SQL Server 支援使用結果集保留性。
您可以使用 SQLServerConnection 類別的 setHoldability 方法來設定結果集保留性。 使用 setHoldability 方法來設定保留性時,您可以使用 ResultSet.HOLD_CURSORS_OVER_COMMIT 或 ResultSet.CLOSE_CURSORS_AT_COMMIT 的結果集保留性常數。
JDBC Driver 也支援在建立 Statement 物件時設定可保留性。 使用結果集保留性參數來建立具有多載的陳述式物件時,陳述式物件的保留性必須與連接的保留性相符。 如果它們不相符,就會引發例外。 這是因為 SQL Server 只會在連接層級支援保留性。
結果集的保留性,是在建立結果集時與該結果集相關聯之 SQLServerConnection 物件的保留性,且僅適用於伺服器端游標。 不適用於用戶端游標。 所有使用用戶端游標的結果集,其可保留性值一律為 ResultSet.HOLD_CURSORS_OVER_COMMIT。
對於伺服器游標,當連線至 SQL Server 2005 或更新版本時,設定可保留性只會影響尚未在該連線上建立之新結果集的可保留性。 這表示,設定可保留性不會影響先前建立,且已在該連線上開啟的任何結果集之可保留性。
在下列範例中,會在執行由 try 區塊中兩個獨立陳述式所組成的本機交易過程中,設定結果集的保留性。 這些語句會執行於 AdventureWorks2025 範例資料庫中的 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();
}
}
}