问题
如下:当在其他对象中调用a方法时,b方法和c方法上标注的事物是失效的,即b方法和c方法上有没有@Transactional
是一样的效果的,都不会生效。b方法和c方法是否有事物只看a方法上是否有事物。若a方式上有事物,则b方法和c方法有事物,否则b方法和c方法没有事物。
public AService {public void a(){......b();c();}@Transactionalpublic void b(){......}@Transactionalpublic void c(){......}
}
解决
1、方法一
将这些方法拆分为多个对象
@RequiredArgsConstructor
public AService {private final BService bService;private final CService cService;@Transactionalpublic void a(){......bService.b();cService.c();}}public BService {@Transactionalpublic void b(){......}
}public CService {@Transactionalpublic void c(){......}
}
2、方法二
1、引入aop-starter
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2、开启aspectj动态代理功能,让所以的动态代理都是aspectj,并对外暴露代理对象。
在启动类上添加@EnableAspectJAutoProxy(exposeProxy = true)
3、本类调用有代理对象来调
public AService {public void a(){......AService aService = (AService) AopContext.currentProxy();aService.b();aService.c();}@Transactionalpublic void b(){......}@Transactionalpublic void c(){......}
}