BEGIN-COMMIT 計數不符:交易計數錯誤
在預存程序在EXECUTE 語句中呼叫另一個預存程序的情況下,如果交易計數不匹配,可能會出現錯誤。以下錯誤訊息說明了此問題:
Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 1, current count = 0
根本原因
當呼叫方儲存程序啟動交易(使用BEGIN)且被呼叫方時,通常會發生此錯誤預存程序無法正確處理交易
調查
檢查程式碼後發現,被呼叫者儲存程序沒有檢查其TRY/CATCH 區塊中的事務中止或未提交的事務。發生異常時,應正確處理事務。
解決方案
要解決此問題,應修改被呼叫者儲存程序以包含對交易狀態的正確處理。以下範例示範了建議的方法:
CREATE PROCEDURE [usp_my_procedure_name] AS BEGIN SET NOCOUNT ON; DECLARE @trancount INT; SET @trancount = @@TRANCOUNT; BEGIN TRY IF @trancount = 0 BEGIN TRANSACTION ELSE SAVE TRANSACTION usp_my_procedure_name; -- Do the actual work here label exit: IF @trancount = 0 COMMIT; END TRY BEGIN CATCH DECLARE @error INT, @message VARCHAR(4000), @xstate INT; SELECT @error = ERROR_NUMBER(), @message = ERROR_MESSAGE(), @xstate = XACT_STATE(); IF @xstate = -1 ROLLBACK; IF @xstate = 1 AND @trancount = 0 ROLLBACK IF @xstate = 1 AND @trancount > 0 ROLLBACK TRANSACTION usp_my_procedure_name; RAISERROR ('usp_my_procedure_name: %d: %s', 16, 1, @error, @message); END CATCH END GO
其他資源
以上是如何修復預存程序中的「EXECUTE 後的交易計數顯示 BEGIN 和 COMMIT 語句的數量不符」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!