不久前遇到一个很奇怪的问题,MySQL的存储过程只执行了一半,而且事务的@error还是为0, 并没有返回错误。并且这种情况是随机产生的,郁闷ing…
具体情况: 在MySQL的存储过程(父过程)中调用另一个存储过程(子过程),并且 子过程 包含在事务之中, 在子过程前面的SQL语句执行成功,子过程执行成功, 子过程后面的SQL语句没有执行,事务没有报错,也没有回滚。 奇妙な異常!
DELIMITER $$ DROP PROCEDURE IF EXISTS test_sp1 $$ CREATE PROCEDURE test_sp1( ) BEGIN START TRANSACTION; INSERT INTO `table ` (`id`, `last_time`) VALUES (NULL, CURRENT_TIMESTAMP); /* 执行成功 */ CALL test_sp2(); /* 执行成功 */ UPDATE `sp_table` SET `var` = `var` + 1 WHERE `ID` = 1; /* 没有执行 */ IF @@error_count = 0 THEN COMMIT; ELSE ROLLBACK; END IF; END$$ DELIMITER ;
最后发现子过程中返回了结果集(SELECT something;), 写成INTO的形式(SELECT something INTO @result; )整个父存储过程就能执行完整。 难道返回的结果集会发生覆盖? 以后除了给程序调用的存储过程,都使用INTO形式返回结果。

[...] 《执行一半的存储过程 – MySQL邯郸学步》中存储过程执行了一半, 而很不幸的,这里的 test_sp1() [...]