最近遇到一個向表插入數據時,拋出 “當前事務無法提交,而且無法支持寫入日志文件的操作。”的異常, 詳細如下;
此操作只是一個簡單的insert操作, 經過排查原因是此表上有對應insert觸發器。原因是 里面對應寫有try catch,並且將設置了SET XACT_ABORT ON;
我們知道觸發器本事就是一個事務,SET XACT_ABORT ON代表的意思是 程序如果遇到錯誤就回滾。如果在程序中沒有try catch的情況下 就直接回滾了。但是如果有try catch的話,在 try塊中出現了錯誤,被catch捕獲以后。Xact_state()就會變成-1 。
Xact_state()是一個系統函數
0表示沒有活動事務
1表示有活動事務並且可以提交
-1表示有活動事務
當Xact_state()=-1時存在活動事務,但是無法提交,換句話說就是只能rollback。所以在你提交的時候就會報錯“當前事務無法提交,而且無法支持寫入日志文件的操作。請回滾該事務。”
解決:
1、 在catch中對Xact_state()的值進行判斷如果為-1的話 直接rollback
2、 如果在子存儲過程中存在try catch的話 最好去掉 讓錯誤往上一級拋出,由上一級做處理