@Transactional失效场景介绍
先说结论
- Transactional注解标注方法修饰符为非public时,@Transactional注解将会不起作用
- 调用同一类内部@Transactional标注的方法(使用this关键字),也会导致事务不开启
- 事务方法内部捕捉了异常,没有抛出新的异常,导致事务操作不会进行回滚
@Transactional注解不起作用原理分析
第一种:
@Transactional是基于动态代理实现的,@Transactional注解实现原理中分析了实现方法,在bean初始化过程中,对含有@Transactional标注的bean实例创建代理对象,这里就存在一个spring扫描@Transactional注解信息的过程,不幸的是源码中体现,标注@Transactional的方法如果修饰符不是public,那么就默认方法的@Transactional信息为空,那么将不会对bean进行代理对象创建或者不会对方法进行代理调用
第二种
通过第一种不生效的原因,我们知道了事务管理是基于动态代理对象的代理逻辑实现的,那么如果在类内部调用类内部的事务方法,这个调用事务方法的过程并不是通过代理对象来调用的,而是直接通过this对象来调用方法,绕过的代理对象,肯定就是没有代理逻辑了
第三种:
事务想要回滚,必须能够捕捉到异常才行,如果异常中途被捕捉掉,那么事务将不会回滚。