Spring中同一个类中方法调用事务不生效,非事务方法调用事务方式事务不生效

我们假定在SerivceXXX中有两个方法:

  1. serviceA 非事务方法
  2. serviceB事务方法
    如果serviceA中方法定义类似如下:

public void serviceA(){
........
serivceB
...........
}
@Transactional
public void serviceB(){

.......

}

则调用serviceA方法的时候,serviceB方法的事务并不能被激活,查看之前我们研究的spring事务实现的原理篇,其实原理很简单,
spring中事务使用范例,事务传播机制实现逻辑,底层原理,事务回滚,事务嵌套 以及我们说的Spring的AOP实现原理
我们需要清楚的是,spring中的事务是基于AOP切面来实现的,我们这里的ServiceXXX,如果需要代理,比如存在事务的增强,则返回到IOC容器中的是一个经过代理后的Bean而不是我们原始的Bean,IOC中并不是ServiceXXX,而是ServiceXXXProxy,ServiceXXXProxy持有实际的ServiceXXX,这个这一点需要明白,在方法执行的时候,实际上是代理类在执行,如果说这个方法上没有事务,ServiceXXXProxy在实际执行的时候实际上使用代理类中持有的实际类去调用,这时候就是ServiceXXX.serviceA而不是ServiceXXXProxy.serviceA,ServiceXXX自己本身是无法处理事务的,只有ServiceXXXProxy才能,在ServiceXXX.serviceA中调用serviceB没有任何机制能够检测是否有事务,就是执行了serviceB方法,这时候serviceB上面事务注解是没有任何作用。
其实通过上面的理解,在同一个类中,调用本类的方法,不管serviceA方法、serviceB方法上面是否有事务,在serviceA方法中调用serviceB的方法,serviceB的事务是不会生效的。

要想起作用,可以如下调整:

  1. serviceB方法放入其他类中调用
  2. 在当前ServiceXXX中注入自己:
@Service
public class ServiceXXX{
	@Autowired
	private ServiceXXX service;
}

需要明确的是,这里注入的 private ServiceXXX service其实并不是ServiceXXX自己,而是经过spring的AOP增强后产生的代理类ServiceXXXProxy


版权声明:本文为LeoHan163原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。