【发布时间】:2020-05-25 01:41:30
【问题描述】:
我已阅读有关退出处理程序的文档,并在相关的 SO 问题 here 和 here 等地方找到了有用的代码想法。
尽管如此,调用下面的存储过程似乎可以完成,并为参数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