阶段3 2.Spring_10.Spring中事务控制_3 作业-基于注解的AOP实现事务控制及问题分析_下
此时没有异常
测试我们的方法
执行报错
注解在实际的测试过程中,实际的执行顺序是有问题的。会先调用最终通知。然后再调用后置通知
最终通知已经关闭了连接。再调用后置通知肯定报错。
getThreadConnection发现当前线程上已经没有连接了
没有链接了会去再拿一个链接。再绑定到线程上。虽然已经绑定上去了。由于前置通知已经执行完了。这个connection自动提交已经是true了
再提交就不行了。
这里我们把自动提交设置为false测试下
通过打断点的方式。再下面三个地方加断点
运行测试,使用dubug的方式
首先断点同流在这里拿链接
由于没有就会链接池里面拿一个,并且设置为false。然后绑定线程
执行完了然后开启事物
执行到转账的方法之后。就会又来到这个地方
这个时候我们的线程上有连接。就往下走不拿链接
点击左下角绿色按钮放过这个ddao中的方法
点了好几次绿色的。跳转到了 这个release方法。也就是最终通知先走了
再次点击绿色的
这个时候才来到commit。但是由于release已经走过了。
再往下走已经没有任何意义
就算它提交了 数据库也不会改变。因为刚才执行操作的connection已经先关闭了。新的connection虽然提交没有异常。但是里面也没有任何的执行操作
画图
执行了最终通知后。线程解绑
最终解决方法就是环绕通知
把通知的注释都去掉。然后定义环绕通知的方法
这里的异常捕获要用Throwable
环保通知的注解
测试
转账成功
放开异常
转账失败。事务被控制住了