@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 TestServiceProxy extends TestService {
TestService target;
public void insert(){
//1.开启事务
//2.从数据源连接中获取一个连接connect
//执行真正的业务
//target就是真正的普通对象TestService
target.insert
//判断是否出现异常
//commit或者rollback
}
}
在上述案例中,当调用到insert(Test test)这时调用到此方法的对象已经是真正的普通对象了。
所以在执行insert2(test);时仍是普通对象,也就直接执行insert2(test);。所以不会出现抛出已存在事务的异常。



