本类方法调用事务失效
同一个对象内事务方法互相调用默认失败,因为绕过了代理对象。相当于b、c的事务不会生效,和a共用一个事务。
@Transactional(timeout = 30)public void a(){b();c();}@Transactional(propagation = Propagation.REQUIRED,timeout = 2)public void b(){}@Transactional(propagation = Propagation.REQUIRES_NEW,timeout = 20)public void c(){}
解决
- 引入aop依赖,使用里面的aspectj做动态代理
<!--引入aop依赖,使用里面的aspectj做动态代理--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>
- 开启aspectj动态代理功能,并对外暴露代理对象。以后所有动态代理都是用aspectj创建(即便没有接口也可以创建动态代理)
@EnableAspectJAutoProxy(exposeProxy= true)
- 使用动态代理调用
@Transactional(timeout = 30)public void a(){OrderServiceImpl orderService = (OrderServiceImpl) AopContext.currentProxy();orderService.b();orderService.c();}