spring事务失效场景
首先spring的事务是使用AOP来实现的,而AOP的底层是代理(JDK代理或者CGLIB代理),所以事务失效就想什么时候不能进行代理
该描述的是使用注解@Transactional的方式来配置事务
-
配置的方法非public修饰
由于事务是使用的代理,而代理对于非public的方法不生效
-
配置的所在类非spring容器管理的bean
-
注解修饰的方法被所在类使用this或默认调用
Spring在扫描Bean的时候会自动为标注了@Transactional注解的类生成一个代理类(proxy),当有注解的方法被调用的时候,实际上是代理类调用的,代理类在调用之前会开启事务,执行事务的操作,但是同类中的方法互相调用,相当于this.B(),此时的B方法并非是代理类调用,而是直接通过原有的Bean直接调用,所以注解会失效
-
默认情况下,业务抛出异常为非RuntimeException异常
由于默认情况下只对于RuntimeException异常回滚
-
业务代码使用try…catch捕获异常,然后直接消化了,并未抛出异常
-
注解中设置了错误的传播方式