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

Toh*_*hid 24 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
Run Code Online (Sandbox Code Playgroud)

任何的想法 ?

Rah*_*thi 5

尝试这样,即,在中包含您的Declare语句START TRANSACTION;。先前您ROLLBACK不是TRANSACTIONSTART 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
Run Code Online (Sandbox Code Playgroud)

  • 看来问题在于,在“ START TRANSACTION”之后,MySQL不会期望“ DECLARE” ... (3认同)

Bil*_*win 5

两个语法错误:

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

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

所以你需要这个:

DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING
BEGIN
    ROLLBACK;
END;
Run Code Online (Sandbox Code Playgroud)