ホームページ  >  記事  >  データベース  >  MySQL ストアド プロシージャがトランザクションを正常に実行できないのはなぜですか?

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

DDD
DDDオリジナル
2024-10-24 23:47:30303ブラウズ

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

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