@Transactional的踩坑和实践

最佳实践:
1.当使用 @Transactional 的时候,都新启一个类来写,不要在同一个类中相互调用,可以避免很多坑。比如类中包含非事务方法a和事务方法b,a中调用b,b的事务就不会生效,都是代理的问题,aspectJ 也有很多类似的坑。
2.当外层事务方法调用内层事务方法,内层事务方法传播属性是 REQUIRED 时,内层方法抛出异常,外层方法不管 catch 不 catch 都会回滚;
3.当外层事务方法调用内层事务方法,内层事务方法传播属性是 NESTED 时,内层方法抛出异常,外层方法 catch ,外层方法不会回滚;不 catch 都会回滚;

@Transactional(rollbackFor = Exception.class)
    public void a() {
        try {
            db1();
            b();
        } catch (Exception e) {
            // b 方法如果是 Propagation.REQUIRED,不管catch 与否,a() 都会回滚,db1和db2方法都会回滚
            // b 方法如果是 Propagation.NESTED,catch 了,a() 不会回滚,b() 会回滚;不 catch,a()和 b() 都会回滚
        }

    }

    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
    public void b() throws Exception {
        db2();
    }

    protected void db1() {
    }

    protected void db2() {
    }
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值