Mysql事务问题求指教(在线等)?报错-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

Mysql事务问题求指教(在线等)?报错

爱吃鱼的程序员 2020-06-22 10:53:11 75

现有两存储过程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的图片: 



A嵌套B  现在是B报错了之后A回滚了 B没回滚求指教
存储 SQL 关系型数据库 MySQL
分享到
取消 提交回答
全部回答(1)
  • 爱吃鱼的程序员
    2020-06-22 10:53:27

    那就是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处产生回滚,这是你的本意??

    0 0
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

推荐文章
相似问题