首頁  >  文章  >  資料庫  >  為什麼我的 MySQL 預存程序在新增事務控制後失敗?

為什麼我的 MySQL 預存程序在新增事務控制後失敗?

Linda Hamilton
Linda Hamilton原創
2024-10-24 18:45:24550瀏覽

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

對 MySQL 預存程序中的事務進行故障排除

將預存程序修改為事務性應該很簡單,但技術細節通常會造成障礙。一位使用者在新增事務控制項後其程式表現不穩定時遇到了這樣的問題。

使用者提供的有問題的程式碼片段複製如下:

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

使用者強調程式運作正常在引入事務控制之前,它是完美的,但之後,它甚至阻止了儲存修改的基本任務。使用者搜尋了 MySQL 文件和線上資源,但沒有偵測到明顯的錯誤。

解決問題

對提供的程式碼的分析發現了兩個語法錯誤:

  1. DECLARE EXIT HANDLER 語句在指定的SQL 異常之間必須有逗號。 MySQL 文件明確提到了這項要求。
  2. EXIT HANDLER 的 BEGIN...END 區塊必須以分號結尾,因為它是一個單獨的語句,需要正確終止。

要解決此問題,應將 DECLARE EXIT HANDLER 語句修改如下:

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

透過這些修正,儲存程序應成功實現事務性。

以上是為什麼我的 MySQL 預存程序在新增事務控制後失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn