Java @Transactional报错Transaction rolled back because it has been marked as rollback-only 如何处理

Java @Transactional事务嵌套异常,报错Transaction rolled back because it has been marked as rollback-only

一、概述
事务不生效,try case 没有包住异常信息,导致case了以后还继续报错,问题是因为事务嵌套异常导致的。是什么原因出现的,如何解决 Transaction rolled back because it has been marked as rollback-only 翻译为:事务回滚,因为它被标记为仅回滚。

二、出问题的代码

@Transactional
@Override
public boolean A(User user) {
  try {
  userMapper.B(user);
  } case {
   //这里做了保存,没有继续向上抛错
  }
}
@Transactional
@Override
public boolean B(User user) {
  
  .....
  int i = 1/0;  /这里报错了
  return  false;
}

三、原因
A调用B的时候,B方法抛错了,被记录上需要进行异常回滚了,但是方法返回给A的时候,A接受到了异常,并想在case中处理,并不继续抛出异常,在A进行提交时,事务不允许进行提交,因为B执行的时候就标记上此事务需要回滚,会直接抛出 Transaction rolled back because it has been marked as rollback-only

四、解决思路
1、在B方法中进行try case case中不进行抛错处理
2、在A方法case中继续抛错处理
3、在B方法上的Transaction 添加事务传播规则为 propagation = Propagation.REQUIRES_NEW 新建事务进行处理
4、将A方法上的Transaction事务去掉

可以根据自己的场景进行处理。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值