【问题标题】:Why does this MySQL stored procedure not seem to execute its exit handler?为什么这个 MySQL 存储过程似乎没有执行它的退出处理程序?
【发布时间】:2020-05-25 01:41:30
【问题描述】:

我已阅读有关退出处理程序的文档,并在相关的 SO 问题 herehere 等地方找到了有用的代码想法。

尽管如此,调用下面的存储过程似乎可以完成,并为参数success 返回一个 TRUE 值。当我知道它肯定没有完成时,尤其是因为主体 SQL 中存在语法错误(它指的是一个不存在的字段)。

所以退出处理程序应该已经启动并为参数success返回了 FALSE。

谁能帮我理解为什么失败的交易没有返回正确的参数值? (我怀疑这与我将 success 设置为 true 的位置有关)

事务中的实际 SQL 对这个问题并不重要,所以我没有展示它。只需假设它可能会或可能不会成功完成交易。我想通过参数检测的是那个事务的成功或失败

DELIMITER $$
CREATE PROCEDURE do_thing (OUT success BOOLEAN)     

DETERMINISTIC
 BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN SET success := FALSE; ROLLBACK; END;   # rollback on any error
DECLARE EXIT HANDLER FOR SQLWARNING  BEGIN SET success := FALSE; ROLLBACK; END;     # rollback on any warning

START TRANSACTION;

       < SQL that might cause an error >
       < in my case it was referring to a field that didn't exist>

COMMIT;
SET success := TRUE;  
END$$
DELIMITER ;

【问题讨论】:

    标签: mysql stored-procedures transactions


    【解决方案1】:

    DBFIDDLE

    第一部分是您的代码的副本,它会引发错误....

    第二部分已更正,DECLARE EXIT 均在块内移动。

    第三部分是@success 将设置为false 的示例。

    【讨论】:

    • 感谢您不厌其烦。但我现在不得不承认,我将代码复制到问题中时出错了。实际上,我确实已经在 Begin-end 块内有 DECLARE EXIT 行,而不是在我的问题显示的外面(否则我会遇到与您演示的相同的语法错误)我已经编辑了我的问题以反映真实情况。那就是说您的答案现在与我的代码相同,所以我不知道为什么我的答案没有返回 false 而您的答案。我已经接受了你的回答,因为它非常好(就我最初的问题而言是正确的)
    • 你写了The actual SQL inside the transaction is not important,但也许它是......你能提供一个例子,返回false,你期望true,其中包含一个实际的SQL语句?跨度>
    • SELECT field1 FROM test; -- field1 在表测试中不存在,所以这应该失败并返回 @success 为 false
    • 它确实返回false,请参阅dbfiddle
    猜你喜欢
    • 1970-01-01
    • 2016-01-10
    • 2016-10-08
    • 1970-01-01
    • 2012-11-05
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多