「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > MySQL ストアド プロシージャがトランザクションを正常に実行できないのはなぜですか?

MySQL ストアド プロシージャがトランザクションを正常に実行できないのはなぜですか?

2024 年 11 月 18 日に公開
ブラウズ:408

Why Do My MySQL Stored Procedures Fail to Execute Transactions Successfully?

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 つの構文エラーが特定されました:

  1. カンマがありませんExit Handler:

    • EXIT HANDLER 宣言には、条件を区切るにはカンマを使用してください。
  2. セミコロンがありません:

    • EXIT HANDLER の END ステートメントに終了するsemicolon.

修正されたコード

修正されたコードは次のとおりです:

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