开发者社区> 问答> 正文

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

现有两存储过程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没回滚求指教

展开
收起
爱吃鱼的程序员 2020-06-22 10:53:11 615 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

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

    2020-06-22 10:53:27
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
搭建电商项目架构连接MySQL 立即下载
搭建4层电商项目架构,实战连接MySQL 立即下载
PolarDB MySQL引擎重磅功能及产品能力盛大发布 立即下载

相关镜像