Spring @Transactional注解事务不生效的情况

@Transactional能标记私有方法不生效

transactional标签用于将对应包装的bean设置成一个新的代理bean对象供外部使用,就是说外部调用这个proxy bean的公共方法时先会调用开启事务等的切面工作,若设置成私有方法只能类内用this指针调用,这样被调用的bean是其本身,不是proxy对象,因此没有transactional切面的意义

问题不是私有的,也不是公开的,问题是:它是如何被调用的,以及您使用的是哪个AOP实现!

如果您使用(默认)Spring代理AOP,那么Spring提供的所有AOP功能(如@Transational)只有在调用通过代理时才会考虑。-通常情况下,如果从另一个豆子。

这有两个含义:

因为不能从另一个bean调用私有方法(例外是反射),所以它们的
@Transactional

注释没有被考虑在内。
如果该方法是公共的,但它是从同一个bean调用的,那么它也不会被考虑(只有在使用了Spring代理AOP(默认)时,这个语句才是正确的)。
@见弹簧参考:第9.6章代理机构

您应该使用AspectJ模式,而不是Spring代理,这将解决问题。AspectJ事务方面甚至被编织成私有方法(Spring3.0检查)。

方法可见性和@Transactional

在使用代理时,应用@Transactional只对具有公共可见性的方法进行注释。如果确实对受保护的、私有的或包可见的方法进行注释,则使用@Transactional注释,不会引发错误,但带注释的方法不会显示已配置的事务设置。如果需要注释非公共方法,请考虑使用AspectJ(见下文)。

@Transactional注解事务不生效的 case

数据库不支持事务
注解放在了私有方法上
类内部调用
未捕获异常
多线程场景
传播属性设置问题

SpringBoot 系列教程之事务不生效的几种 case

你可能感兴趣的:(SpringBoot)