Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Membetulkan 'Kiraan transaksi selepas EXECUTE menunjukkan bilangan yang tidak sepadan bagi penyata BEGIN dan COMMIT' Ralat dalam Prosedur Tersimpan?

Bagaimana untuk Membetulkan 'Kiraan transaksi selepas EXECUTE menunjukkan bilangan yang tidak sepadan bagi penyata BEGIN dan COMMIT' Ralat dalam Prosedur Tersimpan?

DDD
DDDasal
2025-01-04 22:41:41329semak imbas

How to Fix

Kiraan BEGIN-COMMIT Tidak Padan: Ralat Kiraan Transaksi

Dalam senario di mana prosedur tersimpan memanggil prosedur tersimpan lain dalam pernyataan EXECUTE, satu ralat mungkin berlaku jika kiraan transaksi tidak sepadan. Mesej ralat berikut menggambarkan isu ini:

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

Punca Punca

Ralat ini biasanya berlaku apabila prosedur disimpan pemanggil memulakan transaksi (dengan BERMULA) dan penerima prosedur tersimpan tidak mengendalikan transaksi dengan betul pengecualian.

Penyiasatan

Setelah menyemak kod, didapati bahawa prosedur yang disimpan penerima tidak menyemak pengguguran transaksi atau transaksi tanpa komitmen dalam blok TRY/CATCHnya . Apabila pengecualian berlaku, urus niaga harus dikendalikan dengan betul.

Penyelesaian

Untuk menyelesaikan isu ini, prosedur tersimpan penerima hendaklah diubah suai untuk memasukkan pengendalian keadaan transaksi yang betul . Contoh berikut menunjukkan pendekatan yang disyorkan:

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

Sumber Tambahan

  • [Pengendalian Pengecualian dan Bersarang Transaksi](https://docs.microsoft.com/en-us/sql/t-sql/statements/begin-transaction-transact-sql?view=sql-server-ver15#exceptions-and-nested-transactions)

Atas ialah kandungan terperinci Bagaimana untuk Membetulkan 'Kiraan transaksi selepas EXECUTE menunjukkan bilangan yang tidak sepadan bagi penyata BEGIN dan COMMIT' Ralat dalam Prosedur Tersimpan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn