Spring声明式事务注意点,以及不生效情况

情况1:

class  XxxService{
    public void methodA(){
        methodB()
    }

    @Transactional
    public void methodB(){
        saveXX1();
        saveXX2();
    }
}
  • 入口,调用XxxService的methodA方法。methodA内部调用methodB方法。
  • 情况1【事务不生效】-此事methodA上没有事务注解
  • 可以给methodA也增加@Transactional

情况2:


class  XxxService{
    @Transactional
    public void methodA(){
        methodB()
    }
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void methodB(){
        saveXX1();
        saveXX2();
    }
}
  • 入口,调用XxxService的methodA方法。methodA内部调用methodB方法。methodB意图开启新事务
  • 情况2【事务不新创建,传播沿用methodA的事务】
  • 可以将methodB方法放到其他类中,解决问题。(即:通过YyyService.methodB()方式掉用)

注意点:

  1. 异常问题,spring默认异常是RuntimeException通过下面方法修改,@Transactional(rollbackFor = Exception.class)
  2. 回滚问题,可以通过throw new RuntimeTimeException()回滚,或者try..catch..异常后,显示回滚。
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  1. 如果try… catch..异常后,不再次抛出或者不显示回滚,事务不生效
  2. 数据库引擎要支持事务,如果是mysql,注意表要使用支持事务的引擎,比如innodb,如果是myisam,事务是不起作用的。
  3. 开启注解事务的支持:
 <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

猜你喜欢

转载自blog.csdn.net/lsziri/article/details/78509286