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

DDD
リリース: 2024-10-24 23:47:30
オリジナル
302 人が閲覧しました

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 宣言では、条件をカンマで区切る必要があります。
  2. セミコロンがありません:

    • EXIT HANDLER の END ステートメントに終了セミコロンがありません。

修正されたコード

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

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!