根據預設,在交易內建立的結果集,會在交易認可到資料庫之後或在交易回復時關閉。不過,有時候即使已認可交易之後,讓結果集保持為開啟仍會很有用。為了達到此目的,Microsoft SQL Server 2005 JDBC Driver 支援使用結果集保留性。
可以使用 SQLServerConnection 類別的 setHoldability 方法來設定結果集保留性。使用 setHoldability 方法設定保留性時,可以使用結果集保留性的 HOLD_CURSORS_OVER_COMMIT 或 CLOSE_CURSORS_AT_COMMIT 常數。
注意
JDBC 驅動程式在建立其中一個 Statement 物件時,不支援設定保留性。呼叫具有多載 (其中帶有結果集保留性參數) 的陳述式物件時,會發生例外狀況。
結果集的保留性是 SQLServerConnection 物件的保留性,該物件只有在對伺服器端資料指標建立結果集時,才與結果集相關聯。它不適用於用戶端資料指標。
在下列範例中,會在執行本機交易 (該交易是由 try 區塊中兩個個別陳述式所組成) 時,設定結果集保留性。這些陳述式是針對 SQL Server 2005 AdventureWorks 範例資料庫中的 Production.ScrapReason 資料表執行,並使用儲存點來回復第二個陳述式。這樣會造成只有第一個陳述式認可到資料庫。
public static void executeTransaction(Connection con) {
try {
con.setAutoCommit(false);
con.setHoldability(ResultSet.HOLD_CURSORS_OVER_COMMIT);
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
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));
}
stmt.close();
}
catch (SQLException ex) {
ex.printStackTrace();
try {
con.rollback();
System.out.println("Transaction failed.");
}
catch (SQLException se) {
se.printStackTrace();
}
}