问题描述
@Service("TUserService")
public class UserService {
/**
* 同类方法互调,b和c不论怎么样配置事务,均和a公用一个事务
* 原因:事务是使用代理对象实现的,在a中调用b和c会绕过代理,所以不会有效
*/
@Transactional(propagation = Propagation.REQUIRED)
public void a(){
b();
this.c();
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void b(){
}
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void c(){
}
}
同类方法互调,b和c不论怎么样配置事务,均和a公用一个事务
原因:事务是使用代理对象实现的,在a中调用b和c会绕过代理,所以不会有效
解决方案
- 导入aop依赖,它帮我们引入了aspectj
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
- 开启注解(标记在启动类):@EnableAspectJAutoProxy(exposeProxy = true) [对外暴露代理对象] 开启动态代理功能 而不是jdk默认的动态代理 即使没有接口也可以创建动态代理
- 本类互调用代理对象AopContext
@Transactional(propagation = Propagation.REQUIRED)
public void d(){
// aop上下文,可以强转为当前类或者当前类的接口
UserService userService = (UserService) AopContext.currentProxy();
userService.b();
userService.c();
}