MySQL ストアド プロシージャのトランザクションの問題の解決
MySQL ストアド プロシージャ内でトランザクションを実装しようとすると、開発者が予期しないエラーに遭遇する可能性があります。この記事では、トランザクション ストアド プロシージャの正常な実行を妨げる構文と論理エラーについて説明します。
ケース: 失敗したトランザクション
開発者が次のような問題に遭遇しました。ストアド プロシージャでトランザクションを実装しようとしています。 MySQL のドキュメントに従っているにもかかわらず、この手順は正常に実行されず、変更を保存できなくなります。さらに詳しく調べてみると、コードは構文的に正しいようです。
コードの分析
提供されたコード スニペットは次のとおりです:
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
エラーの特定
詳しく調べると、2 つの構文エラーが特定されました:
カンマがありませんExit Handler:
セミコロンがありません:
修正されたコード
修正されたコードは次のとおりです:
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;
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3