为什么this调用的方法事务不生效
因为this是当前对象的实际对象,而事务只能在代理对象上起作用。因为spring的里面的对象都是经过spring代理的代理对象。通过代理模式,spring可以对对象进行增强。
@Service
public class UserServiceImpl implements UserService {
public void outerMethod() {
// 事务失效:通过 this 调用,绕过代理
this.innerTransactionalMethod();
// 等价于直接调用
innerTransactionalMethod();
}
@Transactional
public void innerTransactionalMethod() {
// 事务注解不会生效
userRepository.save(new User());
}
}
失效原理:
-
JDK 动态代理基于接口实现
-
代理对象实现了
UserService接口 -
this指向的是实际的目标对象(UserServiceImpl),不是代理对象 -
事务切面只拦截代理对象的方法调用

浙公网安备 33010602011771号