ROLLBACK TRANSACTION (Transact-SQL)
適用於:Microsoft Fabric Microsoft Fabric SQL 資料庫中的 SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW) 倉儲
此語句會將明確或隱含的交易回復至交易的開頭,或復原至交易內的儲存點。 您可以使用 ROLLBACK TRANSACTION
來清除從交易開頭或儲存點進行的所有資料修改。 另外,它也會釋出交易所保留的資源。
回復交易不包含對局部變數或數據表變數所做的變更。 此語句不會清除這些變更。
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
包含有效交易名稱的使用者定義變數名稱。 這個變數必須用 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
是表示錯誤的慣用語句。
備註
ROLLBACK TRANSACTION
沒有savepoint_name或transaction_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_name 或 transaction_name 的所有語句都會回復至最 BEGIN TRANSACTION
外層的 語句。 ROLLBACK TRANSACTION
當預存程式完成與呼叫預存程式時的值不同@@TRANCOUNT
時,預存程式中@@TRANCOUNT
的語句會產生參考訊息。 此訊息不會影響後續處理。
ROLLBACK TRANSACTION
如果在觸發程式中發出 :
目前交易中到這個點為止所進行的所有資料修改都會被回復,其中包括觸發程序所進行的任何修改。
觸發程式會在語句之後
ROLLBACK
繼續執行任何剩餘語句。 如果有任何這些陳述式修改資料,不會回復這些修改。 執行這些其餘陳述式並不會引發巢狀觸發程序。在引發觸發程式的語句之後,批次中的語句不會執行。
@@TRANCOUNT
當進入觸發程式時,即使處於自動認可模式,也會遞增一個。 (系統會將觸發程序當做一項隱含的巢狀交易來處理。)
ROLLBACK TRANSACTION
預存程式中的語句不會影響呼叫程式之批次中的後續語句;批次中的後續語句會執行。 ROLLBACK TRANSACTION
觸發程式中的 語句會終止批次,其中包含引發觸發程式的語句;批次中的後續語句不會執行。
對資料指標的影響 ROLLBACK
是由下列三個規則所定義:
使用
CURSOR_CLOSE_ON_COMMIT
setON
,ROLLBACK
會關閉,但不會解除分配所有開啟的數據指標。OFF
設定CURSOR_CLOSE_ON_COMMIT
時,ROLLBACK
不會影響已完全填入的任何開啟同步STATIC
或INSENSITIVE
數據指標或異步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