Spring事务失效的各种场景
一、访问权限
Java的访问权限主要是:private、default、protected、public,它们的权限则是依次变大。
如果我们在开发的时候定义错误的访问权限,就会导致事务出现问题
@Service
public class DemoService {
@Transactional
private void query(Demo demo) {
}
}
1
2
3
4
5
6
7
8
9
我们可以查看源码,可以明白,spring事务的实现AbstractFallbackTransactionAttributeSource类的computeTransactionAttribute方法中有个判断,如果目标方法不是public,则TransactionAttribute返回null,即不支持事务。
二、方法用final修饰
我们在学习的时候都知道,某个方法不想被子类继承的时候就会加上关键字final,这种写法正常来说是没有问题的,但是如果该方法被用上事务就不行了
@Service
public class DemoService {
@Transactional
public final void query(Demo demo) {
}
}
1
2
3
4
5
6
7
8
这样的话会导致事务的失效,因为spring事务底层实现使用了代理,aop,通过jdk的动态代理或者cgl