mysql - 如何在我的 MySQL 存储过程中使用事务?

标签 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

有什么想法吗?

最佳答案

两个语法错误:

  • 退出处理程序的条件之间需要逗号。注意 syntax documentation显示逗号。

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

所以你需要这个:

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

关于mysql - 如何在我的 MySQL 存储过程中使用事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18817148/

相关文章:

mysql - 如果日期不存在,则获取给定日期的最后一行

php - 如何在线更改 phpMyAdmin 的 'No Privileges'?

mysql - 在MySql存储过程中应该遵循哪种方法来防止SQL注入(inject)

sql-server - 如何在 SQL Server 数据库中搜索字符串?

design-patterns - 对象级事务管理模式

php - MySQL 事务不会因错误而停止

Mysql 搜索并替换为随机字符

php - 什么更好?具有相同实体的多个表与具有更多记录的少数关系表

sql - 如何在sql中的单个查询中查找子节点列表

.net - 为什么 SqlConnection 在交易中途关闭?