首頁 > 資料庫 > mysql教程 > 如何修復預存程序中的「EXECUTE 後的交易計數顯示 BEGIN 和 COMMIT 語句的數量不符」錯誤?

如何修復預存程序中的「EXECUTE 後的交易計數顯示 BEGIN 和 COMMIT 語句的數量不符」錯誤?

DDD
發布: 2025-01-04 22:41:41
原創
351 人瀏覽過

How to Fix

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
登入後複製

其他資源

  • [異常處理和巢狀事務](https://docs.microsoft .com/en-us/sql/t-sql/st atements/begin-transaction-transact-sql?view=sql-server-ver15#exceptions-and-nested-transactions)

以上是如何修復預存程序中的「EXECUTE 後的交易計數顯示 BEGIN 和 COMMIT 語句的數量不符」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板