@Autowired
private UserService service;
@Override
@Transactional(rollbackFor = Exception.class)
public void addUser() {
User user = new User();
save(user);
this.edit(user);
service.edit(user);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void edit(User user) {
//doing something
}
以上这个例子会导致this调用的edit方法的事务失效。为什么呢?
我们通过debug来看一下具体的实例对象
可以看到注入的service对象是被cglib代理过的对象,而cglib代理会生成目标类的子类,并覆盖目标方法进行事务增强,所以service调用的其实是子类的方法。
而this指向的是目标类本身,并不是子类,调用的是目标方法本身,所以没有事务增强,所以事务也就失效了。