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()可以获得代理对象,没有测试,有想法的可以试一下