使用儲存點
儲存點提供了復原部份交易的機制。 在 SQL Server 中,您可以使用 SAVE TRANSACTION savepoint_name 陳述式建立儲存點。 稍後,您可以執行 ROLLBACK TRANSACTION savepoint_name 陳述式來回復到儲存點,而不是回復到交易開始。
如果所處環境不太可能發生錯誤,儲存點會很有幫助。 不常發生錯誤時,使用儲存點來回復交易的一部份,會比在進行更新之前,需測試每筆交易以查看更新是否有效來得更有效率。 更新與回復都是高成本的作業,因此儲存點只有在遇到錯誤的可能性不高,且事前檢查更新可用性的成本相當高的情形下才有效率。
適用於 SQL Server 的 Microsoft JDBC 驅動程式可讓您在使用 SQLServerConnection 類別笉 setSavepoint 方法時,全程使用儲存點。 使用 setSavepoint 方法,您可以在目前交易內建立一個已命名或未命名的儲存點,此方法將傳回 SQLServerSavepoint 物件。 在交易內可建立多個儲存點。 若要使交易回復到指定的儲存點,您可以傳遞 SQLServerSavepoint 物件給 rollback (java.sql.Savepoint) 方法。
在下列範例中,執行本機交易時會使用儲存點,此交易是由 try
區塊的兩個個別陳述式所組成。 這些陳述式會對 AdventureWorks2022 範例資料庫中的 Production.ScrapReason 資料表執行,並會使用儲存點回復第二個陳述式。 這樣會造成只有第一個陳述式認可到資料庫。
public static void executeTransaction(Connection con) {
try(Statement stmt = con.createStatement();) {
con.setAutoCommit(false);
stmt.executeUpdate("INSERT INTO Production.ScrapReason(Name) VALUES('Correct width')");
Savepoint save = con.setSavepoint();
stmt.executeUpdate("INSERT INTO Production.ScrapReason(Name) VALUES('Wrong width')");
con.rollback(save);
con.commit();
System.out.println("Transaction succeeded.");
}
catch (SQLException ex) {
ex.printStackTrace();
try {
System.out.println("Transaction failed.");
con.rollback();
}
catch (SQLException se) {
se.printStackTrace();
}
}
}