web-dev-qa-db-ja.com

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

何か案が ?

24
Tohid

2つの構文エラー:

  • 終了ハンドラーの条件の間にはコンマが必要です。 構文のドキュメント がコンマを示していることに注意してください。

  • 終了ハンドラのENDをセミコロンで終了する必要があります。 DECLAREステートメント自体(BEGIN ... ENDブロックを含む)は他のステートメントと同様であり、ターミネーターが必要です。

これが必要です:

DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING
BEGIN
    ROLLBACK;
END;
5
Bill Karwin

このように試してください。つまり、DeclareステートメントをSTART TRANSACTION;内に含めます。以前のROLLBACKは、START TRANSACTIONの上に書いたようにTRANSACTIONの一部ではありませんでした:-

BEGIN

START TRANSACTION;

DECLARE poid INT;

DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING
BEGIN
    ROLLBACK;
END

    -- 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
5
Rahul Tripathi