測試**:
set xact_abort off問題:gobegin
tran
begin
try
delete
dbo.t
select
*from
[不存在的表]--
事務還在,t表被鎖
--select 1/0 --跳到catch中 回滾
print'11
'end
try
begin
catch
'rollback
'select
@@error
rollback
endcatch
commit
/*問題:
1.select * from [不存在的表] 為什麼會直接跳出,不完成事務?
2.select * from [不存在的表] 是否屬於編譯錯誤?
3.修改為set xact_abort on 可以回滾,如果select * from [不存在的表]是編譯錯誤
那麼聯機文件中:編譯錯誤(如語法錯誤)不受 set xact_abort 的影響。如何解釋?
*/
在乙個session中執行以上**,然後在另外乙個session執行 select * from t,發現select語句被堵塞
原因:sql 編譯的流程 parse->bind->optimize->execute
一般認為從parse到optimize 是編譯階段,execute是執行階段
猜測try catch不會再bind和optimize階段出現的錯誤進行捕獲,以上出現的錯誤可能不被認為是編譯錯誤,所以,使用 xact 為on是可以成功自動回滾
解決方法:
使用 set xact_abort on 來回滾事物
20131014 出現錯誤,顯示事務沒有回滾
測試 set xact abort off gobegin tran begin try delete dbo.t select from 不存在的表 事務還在,t表被鎖 select 1 0 跳到catch中 回滾 print 11 end try begin catch print rollba...
事務回滾與手動回滾
一般我們在開發時,在方法或者類上加了 transactional事務註解,然後會用 try catch 將可能會出問題的 塊包起來,在catch裡面處理捕獲的異常,但是,如果在catch裡面沒有把異常丟擲去,此時事務是不會自動回滾的 比如這種情況 這裡既沒有丟擲異常,也沒有手動回滾,在插入流水表之後...
事務回滾反思
自己以後就用這個部落格了,部落格的更改給大家帶來了很多不便,以前的部落格 停用,因為對於專業的人來說應該用專業的東西,用龐大的技術去顯示it技術的魅力,顯示我們是一支龐大的力量。今天技術總結,看到師姐寫得事件回滾,自己就研究去了,看到有個for迴圈自己感覺這是正確格式麼,自己很迷信的相信然後就以這樣...