出現錯誤,顯示事務沒有回滾

2021-09-20 15:08:43 字數 956 閱讀 9884

測試**:

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

'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迴圈自己感覺這是正確格式麼,自己很迷信的相信然後就以這樣...