从Spring参考2.5:
使用代理时,
@Transactional只能将注释应用于具有公开可见性的方法。如果您对带有注释的受保护的,私有的或程序包可见的方法进行@Transactional注释,则不会引发任何错误,但是带注释的方法将不会显示配置的事务设置。
因此,Spring会忽略
@Transactional非公共方法上的注释。
也,
在代理模式下(默认),将仅拦截通过代理传入的“外部”方法调用。这意味着“自调用”,即目标对象内的一种调用目标对象其他方法的方法,即使被调用的方法标有
@Transactional!,也不会在运行时导致实际事务。
因此,即使您使用方法
public,从同一个类的方法中调用它也不会启动新的事务。
您可以
aspectj在事务设置中使用模式,以便将与事务相关的代码编织到类中,并且在运行时不创建代理。
有关更多详细信息,请参见参考文档。
另一种可能的方法是在类本身中获取类的Spring代理,然后在其上调用方法,而不是
this:
@Service@Transactional(propagation = Propagation.REQUIRED)public class SomeService { @Autowired private ApplicationContext applicationContext; private SomeService getSpringProxy() { return applicationContext.getBean(this.getClass()); } private void doSomeAndThenMore() { // instead of // this.doSometingPublicly(); // do the following to run in transaction getSpringProxy().doSometingPublicly(); } public void doSometingPublicly() { //do some transactional stuff here }}


