现有两存储过程A,B
CREATE DEFINER=`root`@`%` PROCEDURE `A`() _return:BEGIN DECLARE _error INT DEFAULT 0; #异常标记 DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET _error = 1; #sqlexception返回值 START TRANSACTION; #开启事务 CALL B();#调用另一个存储过程 IF @ret < 0 THEN ROLLBACK; LEAVE _return; END IF; IF _error <> 0 THEN ROLLBACK; LEAVE _return; ELSE COMMIT;#提交事务 END IF; END$$
CREATE DEFINER=`root`@`%` PROCEDURE `B`() _return:BEGIN DECLARE _error INT DEFAULT 0; #异常标记 DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET _error = 1; SET out_ret = -1; SET out_desc = '执行失败'; SET @ret = -2; SET @ret_desc = '校验失败'; ###############################这里是一些DML语句 IF _error <> 0 THEN ROLLBACK; SET out_ret = -3; SET out_desc = '执行异常'; LEAVE _return; ELSE SET out_ret = 1; SET out_desc = ''; END IF; END$$ 附上存储过程B的图片:
那就是B没有走到rollback呗,看看是不是没有捕获到异常
那就是B没有走到rollback呗,看看是不是没有捕获到异常
又是存储过程。。。。啥业务非得用存储过程?
又是存储过程。。。。啥业务非得用存储过程?
看了你发的图片链接,不知道是手误还是故意写错的.
存储B没有starttransaction;也不存在commit,但有1个rollback. 我修改了下,把这些都加上了.
我尝试执行了下:
第1次执行,没有设置_error值,这样得到的结果是正确的,所以只到A存储才发生了回滚操作,B未发生. 从这里来看有一种可能性是,外部事务失败时,内部事务若正常进行,可能会导致内部事务不会回滚,这个我还没有证实,有待确认,也没有找到相关的文档说明.
第2次执行,设置_error值,B-rollback.A也rollback.
其实我不知道你不是故意写的,上面的这2个proc,你使用了1个传递变量@ret,这个值会导致A永远在第1个rollback处产生回滚,这是你的本意??
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。