ホームページ >データベース >mysql チュートリアル >ストアド プロシージャの「EXECUTE 後のトランザクション数は、BEGIN ステートメントと COMMIT ステートメントの数が一致しないことを示しています」というエラーを修正する方法

ストアド プロシージャの「EXECUTE 後のトランザクション数は、BEGIN ステートメントと COMMIT ステートメントの数が一致しないことを示しています」というエラーを修正する方法

DDD
DDDオリジナル
2025-01-04 22:41:41350ブラウズ

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/statements/begin-transaction-transact-sql?view=sql-server-ver15#Exceptions-and-nested-transactions)

以上がストアド プロシージャの「EXECUTE 後のトランザクション数は、BEGIN ステートメントと COMMIT ステートメントの数が一致しないことを示しています」というエラーを修正する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。