Rumah  >  Artikel  >  pangkalan data  >  Mengapa Prosedur Tersimpan MySQL Saya Gagal Selepas Menambah Kawalan Transaksi?

Mengapa Prosedur Tersimpan MySQL Saya Gagal Selepas Menambah Kawalan Transaksi?

Linda Hamilton
Linda Hamiltonasal
2024-10-24 18:45:24550semak imbas

Why is My MySQL Stored Procedure Failing After Adding Transaction Controls?

Menyelesaikan Masalah Transaksi dalam Prosedur Simpanan MySQL

Mengubah suai prosedur tersimpan menjadi transaksi haruslah mudah, tetapi teknikal sering menyebabkan sekatan jalan raya. Seorang pengguna menghadapi isu sedemikian apabila prosedur mereka bertindak secara tidak menentu selepas menambah kawalan transaksi.

Coretan kod bermasalah yang disediakan oleh pengguna diterbitkan semula di bawah:

<code class="sql">BEGIN

DECLARE poid INT;

DECLARE EXIT HANDLER FOR SQLEXCEPTION SQLWARNING
BEGIN
    ROLLBACK;
END

START TRANSACTION;

    -- ADD option 5
    INSERT INTO product_option(product_id,option_id,required) VALUES(insertedProductID,5,0);
    SET poid = (SELECT LAST_INSERT_ID());
    INSERT INTO product_option_value(product_option_id,product_id,option_id,option_value_id,quantity,subtract,price,price_prefix,points,points_prefix,weight,weight_prefix) VALUES(poid,insertedProductID,5,50,0,0,4.99,'+',0,'+',0,'+');

    -- ADD option 12
    INSERT INTO product_option(product_id,option_id,required) VALUES(insertedProductID,12,1);

    -- ADD option 13
    INSERT INTO product_option(product_id,option_id,required) VALUES(insertedProductID,13,0);

COMMIT;

END</code>

Pengguna menyerlahkan bahawa prosedur itu berfungsi dengan sempurna sebelum kawalan transaksi diperkenalkan, tetapi selepas itu, ia menghalang walaupun tugas asas untuk menyimpan pengubahsuaian. Pengguna meninjau dokumentasi MySQL dan sumber dalam talian, tetapi tiada ralat yang jelas dapat dikesan.

Menyelesaikan Isu

Analisis kod yang disediakan mendedahkan dua kesilapan sintaksis:

  1. Pernyataan DECLARE EXIT HANDLER mesti mempunyai koma antara pengecualian SQL yang ditentukan. Dokumentasi MySQL secara eksplisit menyebut keperluan ini.
  2. Blok BEGIN...END EXIT HANDLER mesti diakhiri dengan koma bertitik, kerana ia adalah pernyataan yang berasingan dan memerlukan penamatan yang betul.

Untuk menyelesaikan isu tersebut, pernyataan PENGISYTIHARAN PENGENDALI KELUAR hendaklah diubah suai seperti berikut:

<code class="sql">DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING
BEGIN
    ROLLBACK;
END;</code>

Dengan pembetulan ini, prosedur tersimpan harus berjaya melaksanakan transaksi.

Atas ialah kandungan terperinci Mengapa Prosedur Tersimpan MySQL Saya Gagal Selepas Menambah Kawalan Transaksi?. 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