事务注解失效
案例1
@Transactional
public int insert(Test test) {
testMapper.insert(test);
insert2(test);
return 1;
}
@Transactional(propagation = Propagation.NEVER)
public int insert2(Test test){
return testMapper.insert(test);
}
上述代码中,我们期望的结果是执行到insert2方法时会抛出已经存在事务的错误,然而实际上是什么错也没有抛出,这个两个insert操作都成功执行了。
分析:
其实事务也是利用了apo的原理
- 方法执行时,其实是执行了事务代理对象的方法
- 事务代理对象的方法中首先会开启事务,获取数据源连接
- 然后再执行代理对象中的
target
也就是普通对象的方法,这里就是执行真正我们的业务 - 然后事务代理对象会判断上述执行过程中有没有出现异常,进而判断是
commit
还是rollback
原理流程伪代码
class TestServi