ERROR 1305(42000):SAVEPOINT ......不存在

时间:2013-10-29 22:06:23

标签: mysql savepoints

我在我的MYSQL DB中有这个SQL(sproc有空体,所以我猜没有隐式提交?)。

DROP PROCEDURE IF EXISTS doOrder;

DELIMITER $$

CREATE PROCEDURE doOrder(IN orderUUID VARCHAR(40))
  BEGIN
    SAVEPOINT sp_doOrder;

    BEGIN
      DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK TO sp_doOrder;

      -- doing my updates and selects here...

    END;

    RELEASE SAVEPOINT sp_doOrder;
  END $$

DELIMITER ;

当我

call doOrder('some-unique-id');

我得到:错误1305(42000):SAVEPOINT sp_doOrder不存在。

我可能会忽视某些事情......任何想法?

3 个答案:

答案 0 :(得分:2)

您必须使用START TRANSACTION而不是BEGIN来启动存储过程中的事务。

此外,您可能需要将SAVEPOINT语句移动到DECLARE之后(取决于您放置START TRANSACTION的位置)

  

请注意

     

在所有存储的程序中(存储过程和函数,触发器,   和事件),解析器将BEGIN [WORK]视为a的开头   BEGIN ... END块。使用START在此上下文中开始交易   而是交易。

Cf:http://dev.mysql.com/doc/refman/5.6/en/commit.html

答案 1 :(得分:1)

这最终奏效了。谢谢你。

DROP PROCEDURE IF EXISTS doOrder;

DELIMITER $$

CREATE PROCEDURE doOrder(IN orderUUID VARCHAR(40))
  BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK TO sp_order;

    START TRANSACTION;
    SAVEPOINT sp_order;

    -- doing my updates and selects here...

    COMMIT;

  END $$

DELIMITER ;

答案 2 :(得分:1)

由于这是搜索“不存在保存点”时Google的最佳答案,因此我还将在此处添加解决方案。

我在交易中执行的代码中有一个TRUNCATE语句,这导致隐式提交并因此结束了交易。在事务外部创建保存点不会导致错误,只是不会执行。这意味着您第一次发现问题是在尝试释放保存点/将其回滚。

这是导致隐式提交的语句的完整列表:https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html