如果一个方法调用了同一个类中的其他方法那么其他方法在@Transational注解中的propagation属性中无论设置什么样的值都不会生效
代码举例:
@Transactional(propagation = Propagation.REQUIRED)
public String a(){
b();
c();
return "aaa";
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public String b(){
return "bbb";
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public String c(){
return "ccc";
}
在此代码中a方法调用b和c方法但是b和c方法的传播行为不会生效,还是与a相同。
原因:SpringBoot中事务是使用代理对象来控制的,如果是同一个对象内方法互调,默认失败,原因是绕过了代理对象。(因为this本身就是当前对象,是没有经过代理的)
解决:使用代理对象来调用事务方法 1)、引入aop-starter;spring-boot-starter-aop;引入了aspect 2)、@EnableAspectJAutoProxy;开启aspectj动态代理功能。以后所有的动态代理都是aspectj创建的(即使没有接口也可以创建动态代理)。@EnableAspectJAutoProxy(exposeProxy = true)对外暴露代理对象 3)、本类互调用代理对象
举例代码:
@Transactional(propagation = Propagation.REQUIRED)
public String a(){
OrderServiceImpl orderService = (OrderServiceImpl) AopContext.currentProxy();
orderService.b();
orderService.c();
return "aaa";
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public String b(){
return "bbb";
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public String c(){
return "ccc";
}