ROLLBACK TRANSACTION (Transact-SQL)
將明確或隱含的交易回復到交易的開頭,或回復到交易內的儲存點。 您可以使用 ROLLBACK TRANSACTION 清除交易開始之後的所有資料修改,或清除儲存點之前的所有資料修改。 另外,它也會釋出交易所保留的資源。
適用於:SQL Server (SQL Server 2008 透過目前版本)、Azure SQL Database (初始版本,透過目前版本)。 |
語法
ROLLBACK { TRAN | TRANSACTION }
[ transaction_name | @tran_name_variable
| savepoint_name | @savepoint_variable ]
[ ; ]
引數
transaction_name
指派給 BEGIN TRANSACTION 之交易的名稱。 transaction_name 必須符合識別碼的規則,但只可使用交易名稱的前 32 個字元。 當建立巢狀交易時,transaction_name 必須是最外層 BEGIN TRANSACTION 陳述式的名稱。 即使 SQL Server 執行個體不區分大小寫,transaction_name 還是永遠都會區分大小寫。@ 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 對資料指標的作用:
當 CURSOR_CLOSE_ON_COMMIT 設為 ON,ROLLBACK 會關閉所有開啟的資料指標,但不會將它們取消配置。
當 CURSOR_CLOSE_ON_COMMIT 設為 OFF,ROLLBACK 不會影響任何開啟的同步 STATIC 或非感應式資料指標,或已充分擴展的非同步 STATIC 資料指標。 任何其他類型的開啟資料指標都會關閉,但不會取消配置。
終止批次且會產生內部回復的錯誤,會將包含錯誤陳述式之批次中所宣告的所有資料指標取消配置。 所有資料指標都會取消配置,不論它們的類型或 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)