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

时间:2013-09-15 20:25:42

标签: mysql stored-procedures transactions

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

任何想法?

3 个答案:

答案 0 :(得分:5)

尝试这样,即在Declare中加入START TRANSACTION;声明。在您ROLLBACK上面写TRANSACTION之前,START 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 的一部分:

{{1}}

答案 1 :(得分:5)

两个语法错误:

  • 您需要在退出处理程序的条件之间使用逗号。请注意,syntax documentation显示逗号。

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

所以你需要这个:

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

答案 2 :(得分:0)

将您的DECLARE放在第一个BEGIN之后,它应该可以工作。

如果使用BEGIN和END对多个语句进行分组,通常还需要在顶部声明备用DELIMITER并替换;。最后一个END之后。