共用方式為


ROLLBACK TRANSACTION (Transact-SQL)

將明確或隱含的交易回復到交易的開頭,或回復到交易內的儲存點。

語法

ROLLBACK { TRAN | TRANSACTION } 
     [ transaction_name | @tran_name_variable
     | savepoint_name | @savepoint_variable ] 
[ ; ]

引數

  • transaction_name
    這是在 BEGIN TRANSACTION 上,指派給交易的名稱。transaction_name 必須符合識別碼的規則,但只能使用交易名稱的前 32 個字元。當建立巢狀交易時,transaction_name 必須是最外層 BEGIN TRANSACTION 陳述式的名稱。
  • **@**tran_name_variable
    這是包含有效交易名稱之使用者自訂變數的名稱。這個變數必須用 charvarcharncharnvarchar 資料類型來宣告。
  • savepoint_name
    這是 SAVE TRANSACTION 陳述式中的 savepoint_namesavepoint_name 必須符合識別碼的規則。當條件式回復只應影響交易的一部分時,請使用 savepoint_name
  • **@**savepoint_variable
    這是包含有效儲存點名稱之使用者自訂變數的名稱。這個變數必須用 charvarcharncharnvarchar 資料類型來宣告。

備註

ROLLBACK TRANSACTION 會清除交易開始之後的所有資料修改,或清除儲存點之前的所有資料修改。另外,它也會釋出交易所保留的資源。

不含 savepoint_nametransaction_name 的 ROLLBACK TRANSACTION 會回復到交易的開頭。當建立巢狀交易時,這個相同的陳述式會回復所有內部交易,直到最外層的 BEGIN TRANSACTION 陳述式。不論任何一種情況,TRANSACTION 都會將 @@TRANCOUNT 系統函數減量到 0。ROLLBACK TRANSACTION savepoint_name 不會使 @@TRANCOUNT 減量。

ROLLBACK TRANSACTION 陳述式若指定 savepoint_name 便會釋放於儲存點之後所取得的任何鎖定,但是擴大和轉換除外,這些鎖定不會被釋放,也不會轉換回之前的鎖定模式。

ROLLBACK TRANSACTION 無法參考 BEGIN DISTRIBUTED TRANSACTION 所明確啟動或從本機交易擴大的分散式交易中的 savepoint_name

在執行 COMMIT TRANSACTION 陳述式之後,無法回復交易。

交易內可以有重複的儲存點名稱,但使用重複儲存點名稱的 ROLLBACK TRANSACTION 只會回復到最近一個使用這個儲存點名稱的 SAVE TRANSACTION。

在預存程序中,不含 savepoint_nametransaction_name 的 ROLLBACK TRANSACTION 陳述式,會將所有陳述式回復到最外層的 BEGIN TRANSACTION。預存程序中會使 @@TRANCOUNT 在預存程序完成時所擁有的值不同於呼叫這個預存程序時之 @@TRANCOUNT 值的 ROLLBACK TRANSACTION 陳述式,會產生一則參考訊息。這個訊息不會影響後續的處理。

如果在觸發程序內發出 ROLLBACK TRANSACTION:

  • 目前交易中到這個點為止所進行的所有資料修改都會被回復,其中包括觸發程序所進行的任何修改。
  • 觸發程序會在 ROLLBACK 陳述式之後,繼續執行任何其餘陳述式。如果有任何這些陳述式修改資料,不會回復這些修改。執行這些其餘陳述式並不會引發巢狀觸發程序。
  • 不會執行在引發觸發程序的陳述式之後的批次中之陳述式。

當進入觸發程序時,@@TRANCOUNT 會遞增 1,即使在自動認可模式中也一樣。(系統會將觸發程序當做一項隱含的巢狀交易來處理。)

預存程序中的 ROLLBACK TRANSACTION 陳述式並不會影響在批次中呼叫程序的後續陳述式;仍會執行批次中的後續陳述式。觸發程序中的 ROLLBACK TRANSACTION 陳述式會終止包含引發觸發程序之陳述式的批次;不會繼續執行批次中的後續陳述式。

ROLLBACK TRANSACTION 陳述式不會產生任何訊息給使用者。如果在預存程序或觸發程序中需要警告,請使用 RAISERROR 或 PRINT 陳述式。RAISERROR 是指示錯誤的慣用陳述式。

下列三個規則定義 ROLLBACK 對資料指標的作用:

  1. 當 CURSOR_CLOSE_ON_COMMIT 設為 ON,ROLLBACK 會關閉所有開啟的資料指標,但不會將它們取消配置。
  2. 當 CURSOR_CLOSE_ON_COMMIT 設為 OFF,ROLLBACK 不會影響任何開啟的同步 STATIC 或 INSENSITIVE 資料指標,或已充分擴展的非同步 STATIC 資料指標。任何其他類型的開啟資料指標都會關閉,但不會取消配置。
  3. 終止批次且會產生內部回復的錯誤,會將包含錯誤陳述式之批次中所宣告的所有資料指標取消配置。所有資料指標都會取消配置,不論它們的類型或 CURSOR_CLOSE_ON_COMMIT 設定為何,都是如此。其中包括錯誤批次呼叫的預存程序中所宣告之資料指標。在錯誤批次之前的批次中所宣告之資料指標遵照規則 1 和 2。死結錯誤是這個錯誤類型的範例。觸發程序中所發出之 ROLLBACK 陳述式也會自動產生這類錯誤。

權限

需要 public 角色中的成員資格。

請參閱

參考

BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)
BEGIN TRANSACTION (Transact-SQL)
COMMIT TRANSACTION (Transact-SQL)
COMMIT WORK (Transact-SQL)
ROLLBACK WORK (Transact-SQL)
SAVE TRANSACTION (Transact-SQL)

其他資源

控制交易 (Database Engine)
預存程序和觸發程序中的回復與認可
使用包含 COMMIT 或 ROLLBACK TRANSACTION 的 DML 觸發程序
資料指標鎖定

說明及資訊

取得 SQL Server 2005 協助