1、@Transactional 应用在非public方法上
Java的访问权限主要有四种 :private、default、protected、public,它们的权限从左到右,依次变大。
2、方法用final修饰
如果一个方法不想被子类重写,我们可以将该方法定义为final。我们知道@Transactional是通过AOP来实现的,如果方法被定义为了final,那么它就不能被代理类重写,也就无法使用事务
3、未被Spring管理
@Transactional是由Spring容器所管理,如果一个使用@Transactional的Bean不是通过Spring容器创建的(直接new的),则@Transctional是无效的
4、方法内部调用
当@Transactional注解的方法在同一个类的内部被调用时,会导致后面调用方法的@Transactional失效。
这是因为Spring的事务管理是基于AOP(面向切面编程)实现的,而AOP代理默认是通过JDK动态代理或CGLIB代理来实现的。
原理分析
- JDK动态代理:
仅适用于接口上的方法。
如果你的Bean实现了某个接口,Spring会使用JDK动态代理来创建代理对象。 - CGLIB代理:
适用于没有实现接口的类。
Spring会生成一个子类来代理这个Bean。
解决方案
将事务性方法提取到另一个Bean中
5、多线程调用
两个方法不在一个线程中
6 数据库不支持