本类调用带有@transactional注解的方法,通过this.调用时会使事务失效,原因是此时的this对象不是代理对象;当调用方的修饰符中有final时,这是的this对象就是代理对象了,从而事务会生效.
@Component
public class Test {
public final void invokeWithTransaction() {
this.changeData();
}
public final void invokeWithoutTransaction() {
this.changeData();
}
@Transactional(rollbackFor = Exception.class)
public void changeData() {
// operate database
}
}
通过final修饰的方法本类调用带有事务注解的其他方法时,this为代理对象,所以事务changeData方法的事务是生效的
通过不带final修饰的方法本类调用带有事务注解的其他方法时,this为非代理对象,所以事务changeData方法的事务是不生效的
结果很明显了.
那为什么会出现这种情况呢?
我想应该会final修饰的方法无法被重写导致的吧