ホームページ >データベース >mysql チュートリアル >ストアド プロシージャの「EXECUTE 後のトランザクション数は、BEGIN ステートメントと COMMIT ステートメントの数が一致しないことを示しています」というエラーを修正する方法
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 中国語 Web サイトの他の関連記事を参照してください。