在sqlserver中使用事务的注意事项
?????? 這兩天在項目開發中遇到一些業務邏輯需要進行大量的計算和數據的一致性,因此使用到sql事務和try catch。在項目需求中,多個業務邏輯單元分別寫在對應的存儲過程中,并進行事務控制,同時需要一個總調用的存儲過程pro_contry,這個總調用de 存儲過程pro_contry通過事務封裝上面的所有業務邏輯單元存儲過程,當其中任何一個存儲過程出現錯誤時,全部回滾。pro_contry調用過程中發現同時有事務嵌套,又有try catch嵌套。在測試的過程中發現各種離奇的錯誤現記錄如下,
?????? 第一個錯誤:
????????????? 錯誤描述:錯誤號:????? 3930, 錯誤嚴重級別:??????? 16, 錯位狀態:???????? 1, 錯誤存儲過程和觸發器名稱:PRO_A_LogicUnit, 錯誤行號:?????? 150, 錯誤實際信息:當前事務無法提交,而且無法支持寫入日志文件的操作。請回滾該事務。
????????????? 錯誤原因:由于pro_contry 和PRO_A_LogicUnit 中同時使用了try catch捕獲錯誤。
????? ? ???? 解決方法:將子存儲過程PRO_A_LogicUnit的try catch取消,將錯誤由上一級拋出處理
??????
????? 第二個錯誤
SAVE tran @tranName
EXEC Pro_Score_CountEverySubjectStandardRate 130
???????????? 錯誤描述:當前事務無法提交,而且無法回滾到保存點。請回滾整個事務。
???????????? 錯誤原因:由于在pro_contry和PRO_A_LogicUnit同時有事務處理,當PRO_A_LogicUnit中出現錯誤回滾 進行rollback,事務保存點設置錯誤導致。
???????????? 解決方法:應該先判斷是否已經存在事務,若已經存在則設置事務保存點,不存在創建事務處理
DECLARE @tranCounter INTDECLARE @tranName VARCHAR(20)SET @tranCounter = @@TRANCOUNTSET @tranName = 'tran'IF @tranCounter = 0BEGINBEGIN TRAN @tranNameENDELSEBEGINSAVE TRAN @tranNameEND??????? 第三個錯誤
??????? 在內部嵌套事務 ROLLBACK tran
? ? ?? 錯誤描述: 錯誤號:?????? 266, 錯誤嚴重級別:??????? 16, 錯位狀態:???????? 2, 錯誤存儲過程和觸發器名稱:PRO_A_LogicUnit, 錯誤行號:???????? 0, 錯誤實際信息:EXECUTE 后的事務計數指示 BEGIN 和 COMMIT 語句的數目不匹配。上一計數 = 1,當前計數 = 0。
????? 錯誤原因:在事務中begin tran 后@@tranCount 會加1,當commit tran 后會減1,而rollback tran后 @@tranCount = 0,因此在事務嵌套中必須保存begin tran幾次對應的commit tran 也幾次
??????? 第三個錯誤
??????????????? 錯誤描述:
嵌套事務中指定 ROLLBACK tran @tranName
?????????????? 錯誤號:????? 6401, 錯誤嚴重級別:??????? 16, 錯位狀態:???????? 1, 錯誤存儲過程和觸發器名稱:Pro_Score_CountEverySubjectStandardRate, 錯誤行號:?????? 148, 錯誤實際信息:無法回滾 countEverySubjectStandardRate。找不到該名稱的事務或保存點。
不要使用嵌套事務
不能過分使用嵌套事務,非常麻煩
當SET XACT_ABORT ON 后try catch 中遇到程序錯誤時catch 會事務回滾
使用save tran 替代嵌套tran
DECLARE @TranCounter INT;
??? SET @TranCounter = @@TRANCOUNT;
?? ?
??? --當只有一個事務的時候進行回滾,否則嵌套事務由外面的rollback進行回滾
http://hi.baidu.com/duobaiduodu/item/79375ed7b0d60ac71a72b4f6
http://msdn.microsoft.com/zh-cn/library/ms189797.aspx
http://msdn.microsoft.com/zh-cn/library/ms175976.aspx
http://msdn.microsoft.com/zh-cn/library/ms179296%28v=SQL.100%29.aspx
http://wenku.baidu.com/view/8d1d3ded6294dd88d0d26bd0.html
http://msdn.microsoft.com/en-us/library/ms179296%28v=sql.105%29.aspx
http://blog.csdn.net/wufeng4552/article/details/6317515
http://blog.sina.com.cn/s/blog_496cf0e70100i0em.html
http://blog.csdn.net/xmzhaoym/article/details/5120372
http://www.cnblogs.com/yangpei/archive/2010/10/07/1894408.html
轉載于:https://www.cnblogs.com/wala-wo/archive/2012/12/27/5119380.html
總結
以上是生活随笔為你收集整理的在sqlserver中使用事务的注意事项的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何将10元店,做到月2000万流水?
- 下一篇: Poj 3281 Regional C