http://www.2cto.com/database/201308/234728.html
SQL Server事務執行一半出錯是否自動回滾整個事務
大家都知道SQL Server事務是單個的工作單元。如果某一事務成功,則在該事務中進行的所有數據修改均會提交,成為數據庫中的永久組成部分。如果事務遇到錯誤且必須取消或回滾,則所有數據修改均被清除。
所以是不是說事務出錯一定會回滾整個事物呢? 先看幾個個例子:
--createtable create table testrollback(idintprimarykey, namevarchar(10)) SETXACT_ABORTOFF --Default Settings begin tran insert into testrollbackvalues(1,'kevin') insert into testrollbackvalues(2,'kevin') insert into testrollbackvalues(1,'kevin') insert into testrollbackvalues(3,'kevin') commit tran
1 --use SETXACT_ABORT ON 2 SET XACT_ABORTON; 3 begin tran 4 insert into testrollbackvalues(1,'kevin') 5 insert into testrollbackvalues(2,'kevin') 6 insert into testrollbackvalues(1,'kevin') 7 insert into testrollbackvalues(3,'kevin') 8 commit tran 9 10 select *from testrollback 11 全部回滾沒有數據插入 12 13 ---use trycatch to catch error and rollback whole transcation 14 begin tran 15 begin try 16 insert into testrollback values (1,'kevin') 17 insert into testrollback values (2,'kevin') 18 insert into testrollback values (1,'kevin') 19 insert into testrollback values (3,'kevin') 20 commit tran 21 end try 22 begin catch 23 rollback 24 end catch
全部回滾沒有數據插入
對於上面的測試可以看到默認情況下SQL Server只是Rollback出錯的語句而不是整個事物。所以如果想Rollback整個事物的話可以通過SET XACT_ABORT選項設置或者使用Try Catch之類的捕獲錯誤進行Rollback.
對於出現網絡問題會跟上面的結果有點不一樣。在執行事務的過程中,如果Client斷開,那么SQL Server會自動Rollback整個事物。
在SSMS客戶端執行第一條語句,去掉commitTran
SET XACT_ABORTOFF--Default Settings begin tran insert into testrollbackvalues(1,'kevin') insert into testrollbackvalues(2,'kevin') insert into testrollbackvalues(1,'kevin') insert into testrollbackvalues(3,'kevin')
之后斷開連接,在服務器上用DBCC OPENTRAN查看open的事務:
間隔一段時間再執行發現DBCC OPENTRAN已經沒有了,而且查詢表數據也沒有,說明整個事物回滾了。所以在客戶端斷開且事務沒有完成的情況下整個事物回滾。