ROLLBACK TRANSACTION (Transact-SQL)

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

主題連結圖示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 會清除交易開始之後的所有資料修改,或清除儲存點之前的所有資料修改。 另外,它也會釋出交易所保留的資源。

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

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

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

在執行 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 TRANSACTION 陳述式不會產生任何訊息給使用者。 如果在預存程序或觸發程序中需要警告,請使用 RAISERROR 或 PRINT 陳述式。 RAISERROR 是指示錯誤的慣用陳述式。

下列三個規則定義 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 陳述式也會自動產生這類錯誤。

如需示範 ROLLBACK TRANSACTION 的程式碼範例,請參閱<巢狀交易>。

權限

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

範例

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

USE TempDB;
GO

CREATE TABLE ValueTable ([value] int)
GO

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

--These statements start a named transaction,
--insert a two records, and then roll back
--the transaction named in the variable 
--@TransactionName.
BEGIN TRAN @TransactionName
       INSERT INTO ValueTable VALUES(1)
       INSERT INTO ValueTable VALUES(2)
ROLLBACK TRAN @TransactionName

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

SELECT * FROM ValueTable

DROP TABLE ValueTable

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