参考文章地址 百度安全验证,https://www.cnblogs.com/novwind/p/17461448.html
这里讨论的是声明式事务的不生效场景。编程式事务不在此处讨论
要说明spring中哪些场景事务不生效,就要说明spring的事务控制是如何实现的。Spring框架中事务控制的运行原理是基于AOP代理机制实现的,它可以在不修改原有代码的情况下,为指定的方法添加事务控制的逻辑。这样可以大大简化我们的编程工作,也可以提高我们的代码质量和可维护性。
@Transactional 注解默认只对 RuntimeException 和Error 进行回滚,对其他异常不进行回滚。如果需要对其他异常进行回滚,可以通过设置注解的rollbackFor 属性来指定。
@Transactional 注解只能应用在 public 方法上,对于private、protected或default方法无效。这是因为Spring框架默认使用JDK动态代理来生成代理对象,而JDK动态代理只能拦截public方法。如果需要拦截非public方法,可以通过设置Spring容器的aop:config标签的proxy-target-class属性为true,让Spring框架使用CGLIB动态代理来生成代理对象,在Spring Boot中则默认启用此属性。CGLIB动态代理是通过继承目标类来生成子类作为代理对象,因此可以拦截非public方法。
@Transactional 注解只能对外部调用有效,对于同一个类中的内部调用无效。这是因为同一个类中的内部调用并没有经过代理对象,而是直接调用了目标方法,因此无法触发AOP拦截和增强。如果需要对内部调用也进行事务控制,可以通过使用ApplicationContext或AutowireCapableBeanFactory 来获取当前类的代理对象,然后通过代理对象来调用内部方法。
@Transactional 注解可以同时应用在接口、类和方法上,它们之间有继承和覆盖关系。
注解的作用范围:如果在接口上使用注解,它将应用于所有实现该接口的类和方法。如果在类上使用注解,它将应用于该类中的所有方法。如果在方法上使用注解,它将仅应用于该方法。
继承关系:当一个类继承另一个类时,子类继承了父类的@Transactional注解。但是,子类可以选择覆盖父类的注解,并使用自己的注解配置。这意味着子类可以通过覆盖注解来修改事务的传播行为、隔离级别等属性。
基于以上的条件限制,总结出一下15中事务不生效的情况