Transaction rolled back because it has been marked as rollback-only异常产生的原因

Transaction rolled back because it has been marked as rollback-only异常产生的原因

文档

  1. Spring事务传播行为的七种类型
  2. Transaction rolled back because it has been marked as rollback-only异常产生的原因
  3. REQUIRED、REQUIRES_NEW、NESTED的区别

产生原因

在Spring事务传播行为中,如果当前存在事务,PROPAGATION_REQUIRED、PROPAGATION_SUPPORTS、PROPAGATION_MANDATORY这三种事务传播类型会加入到当前事务,加入到当前事务表示:与当前事务同时提交或回滚

如果内层方法抛出异常,整体事务就会被标记为回滚,但是如果此时外层方法捕获内层方法抛出的异常,外层方法又无其它异常,外层方法则会继续执行到结束。此时仍然会做回滚操作,并且会抛出异常:org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only

场景复现

PropagationServiceAImpl.java类的requiredToRequired1方法,事务传播类型为REQUIRED

PropagationServiceBImpl.java类的required方法,事务传播类型为REQUIRED

required方法存在异常

requiredToRequired1调用required方法,并捕获异常,此外,requiredToRequired1无其它异常

  • PropagationServiceAImpl.java

    @Override
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public void requiredToRequired1() {
        update1();
        try {
            propagationServiceB.required();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
  • PropagationServiceBImpl.java

    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public void required() {
        update3();
        int i = 1 / 0;
    }
    
  • 此时,update1、update3均会回滚,并且会抛出org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only异常

  • 如果PropagationServiceAImpl.java类的requiredToRequired1方法有其它的异常抛出,将不会产生上述异常

如有错误,欢迎指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值