ホームページ >データベース >mysql チュートリアル >MySQL ストアド プロシージャがトランザクションを正常に実行できないのはなぜですか?
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 つの構文エラーが特定されました:
終了ハンドラーにカンマがありません:
セミコロンがありません:
修正されたコード
修正されたコードコードは次のとおりです:
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;
以上がMySQL ストアド プロシージャがトランザクションを正常に実行できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。