分享方式:


ROLLBACK TRANSACTION (Transact-SQL)

適用於:Microsoft Fabric 中的 SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW) 倉儲

此語句會將明確或隱含的交易回復至交易的開頭,或復原至交易內的儲存點。 您可以使用 ROLLBACK TRANSACTION 來清除從交易開頭或儲存點進行的所有資料修改。 另外,它也會釋出交易所保留的資源。

回復交易不包含對局部變數或數據表變數所做的變更。 此語句不會清除這些變更。

Transact-SQL 語法慣例

Syntax

SQL Server 和 Azure SQL Database 的語法。

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

Microsoft Fabric、Azure Synapse Analytics 和平行處理數據倉儲資料庫中 Synapse 數據倉儲的語法。

ROLLBACK { TRAN | TRANSACTION }
[ ; ]

引數

transaction_name

指派給 上 BEGIN TRANSACTION交易的名稱。 transaction_name 必須符合識別碼的規則,但只可使用交易名稱的前 32 個字元。 當您巢狀交易時, transaction_name 必須是最 BEGIN TRANSACTION 外層語句的名稱。 transaction_name一律區分大小寫,即使 SQL Server 實例不區分大小寫也一樣。

@tran_name_variable

包含有效交易名稱的使用者定義變數名稱。 這個變數必須用 charvarcharncharnvarchar 資料類型來宣告。

savepoint_name

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

@savepoint_variable

包含有效儲存點名稱的使用者定義變數名稱。 這個變數必須用 charvarcharncharnvarchar 資料類型來宣告。

錯誤處理

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

備註

ROLLBACK TRANSACTION沒有savepoint_nametransaction_name會回復到交易的開頭。 當您巢狀交易時,這個相同的語句會將所有內部交易回復到最 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 儲存點名稱。

互通性

在預存程式中, ROLLBACK TRANSACTION 不含 savepoint_nametransaction_name 的所有語句都會回復至最 BEGIN TRANSACTION外層的 語句。 ROLLBACK TRANSACTION當預存程式完成與呼叫預存程式時的值不同@@TRANCOUNT時,預存程式中@@TRANCOUNT的語句會產生參考訊息。 此訊息不會影響後續處理。

ROLLBACK TRANSACTION如果在觸發程式中發出 :

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

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

  • 在引發觸發程式的語句之後,批次中的語句不會執行。

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

ROLLBACK TRANSACTION 預存程式中的語句不會影響呼叫程式之批次中的後續語句;批次中的後續語句會執行。 ROLLBACK TRANSACTION 觸發程式中的 語句會終止批次,其中包含引發觸發程式的語句;批次中的後續語句不會執行。

對資料指標的影響 ROLLBACK 是由下列三個規則所定義:

  • 使用 CURSOR_CLOSE_ON_COMMIT set ONROLLBACK 會關閉,但不會解除分配所有開啟的數據指標。

  • OFF設定 CURSOR_CLOSE_ON_COMMIT 時,ROLLBACK不會影響已完全填入的任何開啟同步STATICINSENSITIVE數據指標或異步STATIC數據指標。 任何其他類型的開啟資料指標都會關閉,但不會取消配置。

  • 終止批次且會產生內部回復的錯誤,會將包含錯誤陳述式之批次中所宣告的所有資料指標取消配置。 不論數據指標的類型或 設定 CURSOR_CLOSE_ON_COMMIT為何,所有數據指標都會解除分配。 其中包括錯誤批次呼叫的預存程序中所宣告之資料指標。 錯誤批次之前在批次中宣告的數據指標會受限於前兩個規則。 死結錯誤就是這類型錯誤的範例。 ROLLBACK觸發程式中發出的語句也會自動產生這種類型的錯誤。

鎖定行為

ROLLBACK TRANSACTION指定savepoint_name的語句會釋放儲存點以外取得的任何鎖定,但擴大和轉換除外。 這些鎖定不會釋出,而且不會轉換回其先前的鎖定模式。

權限

需要 public 角色的成員資格。

範例

下列範例顯示回復具名交易的作用。 建立數據表之後,下列語句會啟動具名交易、插入兩個數據列,然後復原變數 @TransactionName中名為 的交易。 具名交易外的另一個陳述式會插入兩個資料列。 查詢會傳回前一個陳述式的結果。

USE tempdb;
GO

CREATE TABLE ValueTable ([value] INT);
GO

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

BEGIN TRANSACTION @TransactionName

INSERT INTO ValueTable
VALUES (1), (2);

ROLLBACK TRANSACTION @TransactionName;

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

SELECT [value]
FROM ValueTable;

DROP TABLE ValueTable;

結果集如下所示。

value
-----
3
4