使用保留性
根據預設,在交易內建立的結果集會在交易認可到資料庫之後或在交易回復時保持開啟。 不過,有時候在已經認可交易之後,讓結果集關閉會很有用。 為了達到此目的,Microsoft JDBC Driver for SQL Server 支援使用結果集保留性。
您可以使用 SQLServerConnection 類別的 setHoldability 方法來設定結果集保留性。 使用 setHoldability 方法來設定保留性時,您可以使用 ResultSet.HOLD_CURSORS_OVER_COMMIT
或 ResultSet.CLOSE_CURSORS_AT_COMMIT
的結果集保留性常數。
JDBC Driver 在建立其中一個陳述式物件時,也支援設定保留性。 使用結果集保留性參數來建立具有多載的陳述式物件時,陳述式物件的保留性必須與連接的保留性相符。 如果它們不相符,就會擲回例外狀況。 這是因為 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();
}
}
}