SQL Server事務執行一半出錯是否自動回滾整個事務 【轉】


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已經沒有了,而且查詢表數據也沒有,說明整個事物回滾了。所以在客戶端斷開且事務沒有完成的情況下整個事物回滾。

 

 

-----------------------------

天王蓋地虎小說網:http://www.twgdh.com/

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM