將顯式事務或隱性事務回滾到事務的起點或事務內的某個保存點。
ROLLBACK [ TRAN [ SACTION ]
[ transaction_name | @tran_name_variable
| savepoint_name | @savepoint_variable ] ]
transaction_name
是給 BEGIN TRANSACTION 上的事務指派的名稱。transaction_name 必須符合標識符規(guī)則,但只使用事務名稱的前 32 個字符。嵌套事務時,transaction_name 必須是來自最遠的 BEGIN TRANSACTION 語句的名稱。
@tran_name_variable
是用戶定義的、含有有效事務名稱的變量的名稱。必須用 char、varchar、nchar 或 nvarchar 數據類型聲明該變量。
savepoint_name
是來自 SAVE TRANSACTION 語句的 savepoint_name。savepoint_name 必須符合標識符規(guī)則。當條件回滾只影響事務的一部分時使用 savepoint_name。
@savepoint_variable
是用戶定義的、含有有效保存點名稱的變量的名稱。必須用 char、varchar、nchar 或 nvarchar 數據類型聲明該變量。
ROLLBACK TRANSACTION 清除自事務的起點或到某個保存點所做的所有數據修改。ROLLBACK 還釋放由事務控制的資源。
不帶 savepoint_name 和 transaction_name 的 ROLLBACK TRANSACTION 回滾到事務的起點。嵌套事務時,該語句將所有內層事務回滾到最遠的 BEGIN TRANSACTION 語句。在這兩種情況下,ROLLBACK TRANSACTION 均將 @@TRANCOUNT 系統(tǒng)函數減為 0。ROLLBACK TRANSACTION savepoint_name 不減少 @@TRANCOUNT。
ROLLBACK TRANSACTION 語句若指定 savepoint_name 則不釋放任何鎖。
在由 BEGIN DISTRIBUTED TRANSACTION 顯式啟動或從本地事務升級而來的分布式事務中,ROLLBACK TRANSACTION 不能引用 savepoint_name。
在執(zhí)行 COMMIT TRANSACTION 語句后不能回滾事務。
在事務內允許有重復的保存點名稱,但 ROLLBACK TRANSACTION 若使用重復的保存點名稱,則只回滾到最近的使用該保存點名稱的 SAVE TRANSACTION。
在存儲過程中,不帶 savepoint_name 和 transaction_name 的 ROLLBACK TRANSACTION 語句將所有語句回滾到最遠的 BEGIN TRANSACTION。在存儲過程中,ROLLBACK TRANSACTION 語句使 @@TRANCOUNT 在觸發(fā)器完成時的值不同于調用該存儲過程時的 @@TRANCOUNT 值,并且生成一個信息。該信息不影響后面的處理。
如果在觸發(fā)器中發(fā)出 ROLLBACK TRANSACTION:
每次進入觸發(fā)器,@@TRANCOUNT 就增加 1,即使在自動提交模式下也是如此。(系統(tǒng)將觸發(fā)器視作隱性嵌套事務。)
在存儲過程中,ROLLBACK TRANSACTION 語句不影響調用該過程的批處理中的后續(xù)語句;將執(zhí)行批處理中的后續(xù)語句。在觸發(fā)器中,ROLLBACK TRANSACTION 語句終止含有激發(fā)觸發(fā)器的語句的批處理;不執(zhí)行批處理中的后續(xù)語句。
ROLLBACK TRANSACTION 語句不生成顯示給用戶的信息。如果在存儲過程或觸發(fā)器中需要警告,請使用 RAISERROR 或 PRINT 語句。RAISERROR 是用于指出錯誤的首選語句。
ROLLBACK 對游標的影響由下面三個規(guī)則定義:
ROLLBACK TRANSACTION 權限默認授予任何有效用戶。
相關文章