我该如何在MySQL存储过程中使用事务?

27

我正在尝试修改我的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

有什么想法吗?


1
你能否发布存储过程的完整定义,以CREATE PROCEDURE...开头?什么是insertedProductID,它在哪里被声明了? - peterm
1
@tohid,您忘记在“SQLEXCEPTION SQLWARNING”之间添加“,”了。您应该写成:DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING BEGIN ROLLBACK; END; - Manish Sapkal
另外,https://dev59.com/mmkw5IYBdhLWcg3wUI_x - Pacerier
3个回答

7

两个语法错误:

  • 您需要在退出处理程序的条件之间加上逗号。注意语法文档中显示了逗号。

  • 您需要使用分号终止退出处理程序的ENDDECLARE语句本身(包括其BEGIN…END块)与任何其他语句一样,都需要有一个终止符。

所以您需要这样做:

DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING
BEGIN
    ROLLBACK;
END;

谢谢!我已经按照您的建议进行了更改,但仍然出现相同的错误! - Tohid
你使用的MySQL版本是什么?SELECT VERSION(); - Bill Karwin
我使用了你的代码,没有错误(v.5.6.17)...我真的不明白为什么被接受的答案会得到那么多赞,因为他只是分离了声明,没有提供参考,并且他的“解释”只是陈述了显而易见的事实... - Armfoot

5
尝试这样做,将您的Declare语句包含在START TRANSACTION;中。之前,您的ROLLBACK不是事务的一部分,因为您在START TRANSACTION上方编写了它:
BEGIN

DECLARE poid INT;

DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING

START TRANSACTION;

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

感谢您的快速回复。仍然出现以下错误:您的SQL语法有误,请检查与您的MySQL服务器版本相对应的手册,以获取正确的语法使用方式,位于第11行附近:DECLARE poid INT;DECLARE EXIT HANDLER FOR SQLEXCEPTION SQLWARNING BEGIN RO - Tohid
3
问题似乎是在START TRANSACTION后面,MySQL不允许使用DECLARE语句... - Armfoot
1
在使用BEGIN之后写入其他内容后,您不能再使用DECLARE - Pishang Ujeniya

-1
把你的DECLARE放在第一个BEGIN后面,它应该可以工作。
如果您使用BEGIN和END来分组多个语句,则通常还需要在顶部声明替代DELIMITER,并将最后一个END后面的;替换为它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接