ストアド プロシージャをトランザクション対応に変更するのは簡単ですが、技術的な問題が原因で障害が発生することがよくあります。あるユーザーは、トランザクション制御を追加した後にプロシージャが不安定に動作したときに、このような問題に遭遇しました。
ユーザーが提供した問題のあるコード スニペットを以下に再現します。
<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 ドキュメントとオンライン リソースを調べましたが、明らかなエラーは検出できませんでした。
提供されたコードの分析により、2 つの構文上の間違いが明らかになりました:
この問題を解決するには、DECLARE EXIT HANDLER ステートメントを次のように変更する必要があります:
<code class="sql">DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING BEGIN ROLLBACK; END;</code>
これらの修正により、ストアド プロシージャはトランザクション性を正常に実装できるようになります。
以上がトランザクション制御を追加した後に MySQL ストアド プロシージャが失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。