日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在sqlserver中使用事务的注意事项

發布時間:2025/3/15 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在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中使用事务的注意事项的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。