將預存程序修改為事務性應該很簡單,但技術細節通常會造成障礙。一位使用者在新增事務控制項後其程式表現不穩定時遇到了這樣的問題。
使用者提供的有問題的程式碼片段複製如下:
<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 文件和線上資源,但沒有偵測到明顯的錯誤。
對提供的程式碼的分析發現了兩個語法錯誤:
要解決此問題,應將 DECLARE EXIT HANDLER 語句修改如下:
<code class="sql">DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING BEGIN ROLLBACK; END;</code>
透過這些修正,儲存程序應成功實現事務性。
以上是為什麼我的 MySQL 預存程序在新增事務控制後失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!