使用保留功能

下載 JDBC 驅動程式

預設情況下,在交易內建立的結果集會在交易提交至資料庫後,或在交易復原時保持開啟。 不過,有時候在已經認可交易之後,讓結果集關閉會很有用。 為了達到此目的,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();
        }
    }
}