ROLLBACK TRANSACTION (Transact-SQL)
適用於:Microsoft Fabric 中的 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