Heim >Datenbank >MySQL-Tutorial >Wie behebe ich den Fehler „Transaktionsanzahl nach EXECUTE weist auf eine nicht übereinstimmende Anzahl von BEGIN- und COMMIT-Anweisungen hin' in gespeicherten Prozeduren?

Wie behebe ich den Fehler „Transaktionsanzahl nach EXECUTE weist auf eine nicht übereinstimmende Anzahl von BEGIN- und COMMIT-Anweisungen hin' in gespeicherten Prozeduren?

DDD
DDDOriginal
2025-01-04 22:41:41354Durchsuche

How to Fix

Nicht übereinstimmende BEGIN-COMMIT-Zählungen: Fehler bei der Transaktionszählung

In einem Szenario, in dem eine gespeicherte Prozedur eine andere gespeicherte Prozedur innerhalb einer EXECUTE-Anweisung aufruft, wird ein Es kann ein Fehler auftreten, wenn die Anzahl der Transaktionen nicht übereinstimmt. Die folgende Fehlermeldung veranschaulicht dieses Problem:

Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 1, current count = 0

Grundursache

Dieser Fehler tritt normalerweise auf, wenn die gespeicherte Prozedur des Aufrufers eine Transaktion startet (mit BEGIN) und der Angerufene Die gespeicherte Prozedur verarbeitet die Transaktion nicht ordnungsgemäß Ausnahmen.

Untersuchung

Bei der Überprüfung des Codes wurde festgestellt, dass die aufgerufene gespeicherte Prozedur innerhalb ihres TRY/CATCH-Blocks nicht nach Transaktionsabbrüchen oder nicht festgeschriebenen Transaktionen suchte . Wenn eine Ausnahme auftritt, sollte die Transaktion ordnungsgemäß verarbeitet werden.

Lösung

Um dieses Problem zu beheben, sollte die aufgerufene gespeicherte Prozedur so geändert werden, dass sie eine ordnungsgemäße Verarbeitung des Transaktionsstatus umfasst . Das folgende Beispiel zeigt den empfohlenen Ansatz:

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

Zusätzliche Ressourcen

  • [Ausnahmebehandlung und verschachtelt Transaktionen](https://docs.microsoft.com/en-us/sql/t-sql/statements/begin-transaction-transact-sql?view=sql-server-ver15#Exceptions-and-nested-transactions)

Das obige ist der detaillierte Inhalt vonWie behebe ich den Fehler „Transaktionsanzahl nach EXECUTE weist auf eine nicht übereinstimmende Anzahl von BEGIN- und COMMIT-Anweisungen hin' in gespeicherten Prozeduren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn