1、事务的回滚仅仅对于unchecked的异常有效
注解为事务范围的方法中,事务的回滚仅仅对于unchecked的异常有效。对于checked异常无效。也就是说事务回滚仅仅发生在出现RuntimeException或Error的时候。 如果希望一般的异常也能触发事务回滚,需要在注解了@Transactional的方法上,将@Transactional回滚参数设为:
1
@Transactional(rollbackFor = Exception.class)
2、 Service类内部方法调用
大概就是Service中有一个方法A,会内部调用方法B, 方法A没有事务管理,方法B采用了声明式事务,通过在方法上声明Transactional的注解来做事务管理。
声明式事务是通过AOP动态代理实现的,这样会产生一个代理类来做事务管理,而目标类(service)本身是不能感知代理类的存在的。对于加了@Transactional注解的方法来说,在调用代理类的方法时,会先通过拦截器TransactionInterceptor开启事务,然后在调用目标类的方法,最后在调用结束后,TransactionInterceptor 会提交或回滚事务。
在方法A中调用方法B,实际上是通过“this”的引用,也就是直接调用了目标类的方法,而非通过Spring上下文获得的代理类,所以事务是不会开启的。将不同方法放到不同的类中进行调用即可避免此类错误。