共用方式為


ROLLBACK TRANSACTION (Transact-SQL)

將明確或隱含的交易回復到交易的開頭,或回復到交易內的儲存點。 您可以使用 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
    這是包含有效交易名稱之使用者自訂變數的名稱。 這個變數必須用 char、varchar、nchar 或 nvarchar 資料類型來宣告。

  • savepoint_name
    SAVE TRANSACTION 陳述式的 savepoint_name。 savepoint_name 必須符合識別碼的規則。 當條件式回復只應影響交易的一部分時,請使用 savepoint_name。

  • @ savepoint_variable
    這是包含有效儲存點名稱之使用者自訂變數的名稱。 這個變數必須用 char、varchar、nchar 或 nvarchar 資料類型來宣告。

錯誤處理

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

一般備註

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

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

在執行 COMMIT TRANSACTION 陳述式之後,無法回復交易,但是當 COMMIT TRANSACTION 與所要回復之交易內含的巢狀交易相關聯時,則為例外。 在此情況下,即使您已發出 COMMIT TRANSACTION,也會回復巢狀交易。

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

互通性

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

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

  • 目前交易中到這個點為止所進行的所有資料修改都會被回復,其中包括觸發程序所進行的任何修改。

  • 觸發程序會在 ROLLBACK 陳述式之後,繼續執行任何其餘陳述式。 如果有任何這些陳述式修改資料,不會回復這些修改。 執行這些其餘陳述式並不會引發巢狀觸發程序。

  • 不會執行在引發觸發程序的陳述式之後的批次中之陳述式。

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

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

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

  1. 當 CURSOR_CLOSE_ON_COMMIT 設為 ON,ROLLBACK 會關閉所有開啟的資料指標,但不會將它們取消配置。

  2. 當 CURSOR_CLOSE_ON_COMMIT 設為 OFF,ROLLBACK 不會影響任何開啟的同步 STATIC 或非感應式資料指標,或已充分擴展的非同步 STATIC 資料指標。 任何其他類型的開啟資料指標都會關閉,但不會取消配置。

  3. 終止批次且會產生內部回復的錯誤,會將包含錯誤陳述式之批次中所宣告的所有資料指標取消配置。 所有資料指標都會取消配置,不論它們的類型或 CURSOR_CLOSE_ON_COMMIT 設定為何,都是如此。 其中包括錯誤批次呼叫的預存程序中所宣告之資料指標。 在錯誤批次之前的批次中宣告的資料指標會遵守規則 1 和 2。 死結錯誤就是這類型錯誤的範例。 觸發程序中所發出之 ROLLBACK 陳述式也會自動產生這類錯誤。

鎖定行為

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

權限

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

範例

下列範例顯示回復具名交易的作用。

USE tempdb;
GO
CREATE TABLE ValueTable ([value] int;)
GO

DECLARE @TransactionName varchar(20) = 'Transaction1';

--The following statements start a named transaction,
--insert two rows, and then roll back
--the transaction named in the variable @TransactionName.
--Another statement outside of the named transaction inserts two rows.
--The query returns the results of the previous statements.

BEGIN TRAN @TransactionName
       INSERT INTO ValueTable VALUES(1), (2);
ROLLBACK TRAN @TransactionName;

INSERT INTO ValueTable VALUES(3),(4);

SELECT [value] FROM ValueTable;

DROP TABLE ValueTable;

--Results
--value
-------------
--3
--4

請參閱

參考

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)