首页 >数据库 >mysql教程 >为什么我的 MySQL 存储过程在添加事务控制后失败?

为什么我的 MySQL 存储过程在添加事务控制后失败?

Linda Hamilton
Linda Hamilton原创
2024-10-24 18:45:24642浏览

Why is My MySQL Stored Procedure Failing After Adding Transaction Controls?

对 MySQL 存储过程中的事务进行故障排除

将存储过程修改为事务性应该很简单,但技术细节通常会造成障碍。一位用户在添加事务控件后其程序表现不稳定时遇到了这样的问题。

用户提供的有问题的代码片段复制如下:

<code class="sql">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</code>

用户强调该程序运行正常在引入事务控制之前,它是完美的,但之后,它甚至阻止了保存修改的基本任务。用户搜索了 MySQL 文档和在线资源,但没有检测到明显的错误。

解决问题

对提供的代码的分析发现了两个语法错误:

  1. DECLARE EXIT HANDLER 语句在指定的 SQL 异常之间必须有逗号。 MySQL 文档明确提到了这一要求。
  2. EXIT HANDLER 的 BEGIN...END 块必须以分号结尾,因为它是一个单独的语句,需要正确终止。

要解决此问题,应将 DECLARE EXIT HANDLER 语句修改如下:

<code class="sql">DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING
BEGIN
    ROLLBACK;
END;</code>

通过这些更正,存储过程应成功实现事务性。

以上是为什么我的 MySQL 存储过程在添加事务控制后失败?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn