service内部方法间相互调用,事务不生效解决方案

当Service内部方法相互调用时,Spring事务可能失效,原因是动态代理不会开启新事务。解决办法包括:1) 将方法逻辑移到另一个Service或DAO并注入;2) 使用AopContext.currentProxy()调用代理对象;3) 通过applicationContext.getBean()获取代理对象。这些方法可确保事务正常执行。
摘要由CSDN通过智能技术生成

service内部方法间相互调用,事务不生效解决方案

同一个service内部相互调用,事务失效问题解分析:
在一个Service内部,事务方法之间的嵌套调用,普通方法和事务方法之间的嵌套调用,都不会开启新的事务。 因为spring采用动态代理机制来实现事务控制,而动态代理最终都是要调用原始对象的,而直接使用原始对象在去调用方法时,是不会再触发代理的。

解决方案:
1、把方法B的逻辑放到另外一个service或者dao,然后把这个service或者dao通过@Autowired注入到方法A的bean里面,这样即使方法A没用事务,方法B也可以执行自己的事务。

2、在java配置类上添加注解@EnableAspectJAutoProxy(exposeProxy = true)方式暴漏代理对象,然后在service中通过代理对象AopContext.currentProxy()去调用方法。

  • Java配置类
 @configuration
 @EnableAspectJAutoProxy(exposeProxy="true")
 public class AppConfig{}
  • service调用
 @service
 public class ServiceImpl implements service{

	public void a(Model model){
		((service)ApoContext.currentProxy()).b(model);
	}

	@Transactional(rollbackFor=Exception.class)
	public void b(Model model){
		entity.save(model);
		throw new Exception()
	}
 }

3、直接通过applicationContext.getBean()可以获得代理对象,没有测试,有想法的可以试一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值