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

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值