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
Lepaskan: 2025-01-04 22:41:41
asal
375 orang telah melayarinya

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
Salin selepas log masuk

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
Salin selepas log masuk

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 Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan