ホームページ  >  記事  >  データベース  >  トランザクション制御を追加した後に MySQL ストアド プロシージャが失敗するのはなぜですか?

トランザクション制御を追加した後に MySQL ストアド プロシージャが失敗するのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-24 18:45:24550ブラウズ

Why is My MySQL Stored Procedure Failing After Adding Transaction Controls?

MySQL ストアド プロシージャのトランザクションのトラブルシューティング

ストアド プロシージャをトランザクション対応に変更するのは簡単ですが、技術的な問題が原因で障害が発生することがよくあります。あるユーザーは、トランザクション制御を追加した後にプロシージャが不安定に動作したときに、このような問題に遭遇しました。

ユーザーが提供した問題のあるコード スニペットを以下に再現します。

<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 つの構文上の間違いが明らかになりました:

  1. DECLARE EXIT HANDLER ステートメントでは、指定された SQL 例外の間にコンマが必要です。 MySQL のドキュメントでは、この要件について明示的に言及されています。
  2. EXIT HANDLER の BEGIN...END ブロックは、別個のステートメントであり、適切な終了が必要であるため、セミコロンで終了する必要があります。

この問題を解決するには、DECLARE EXIT HANDLER ステートメントを次のように変更する必要があります:

<code class="sql">DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING
BEGIN
    ROLLBACK;
END;</code>

これらの修正により、ストアド プロシージャはトランザクション性を正常に実装できるようになります。

以上がトランザクション制御を追加した後に MySQL ストアド プロシージャが失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。