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?
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
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!