[20131014] 出现错误,显示事务没有回滚
生活随笔
收集整理的這篇文章主要介紹了
[20131014] 出现错误,显示事务没有回滚
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
[20131014] 出現錯誤,顯示事務沒有回滾
測試代碼:
SET XACT_ABORT OFF goBEGIN TRANBEGIN TRYDELETE dbo.T SELECT * FROM [不存在的表] -- 事務還在,T表被鎖--SELECT 1/0 --跳到Catch中 回滾PRINT '11'END TRYBEGIN CATCHPRINT 'ROLLBACK'SELECT @@ERROR ROLLBACKEND CATCH 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 來回滾事物
posted on 2013-10-14 13:38 Fanr_Zh 閱讀(...) 評論(...) 編輯 收藏轉載于:https://www.cnblogs.com/Amaranthus/p/3368246.html
總結
以上是生活随笔為你收集整理的[20131014] 出现错误,显示事务没有回滚的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c/c++ 编译器内存对齐问题
- 下一篇: TextBox只读时不能通过后台赋值取值