为什么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),不是代理对象

  • 事务切面只拦截代理对象的方法调用

posted @ 2025-03-09 13:54  人在代码在  阅读(52)  评论(0)    收藏  举报