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