问题
![图片[1]-事务管理-深吸氧](https://xiyang-blog.oss-cn-hangzhou.aliyuncs.com/blog/2022/10/image-84-1024x367.png)
我们一个Service中包含多个DAO操作,每个DAO中都有各自的事务管理。如果DAO1执行成功,DAO2执行失败回滚了,那么数据便会出现问题。
比如银行转账的例子:张三给李四转了100块钱,但是张三账户扣除100执行成功了,李四账户增加100出错回滚了,便会出现张三钱转出去了,李四没收到的情况。
事务前置
因此我们可以把事务管理前置到Filter中,当接收到请求后,首先会被Filter拦截,在Service中代码执行报错时,便能在Filter捕获到,并进行回滚。
但是要让DAO1、DAO2、DAO3处于同一个事物,这三个组件需要同一个Connection才行。
![图片[2]-事务管理-深吸氧](https://xiyang-blog.oss-cn-hangzhou.aliyuncs.com/blog/2022/10/image-85-1024x607.png)
代码
在前一篇学习过ThreadLocal,我们可以把Connection保存在ThreadLocal中,实现线程内共享。
![图片[3]-事务管理-深吸氧](https://xiyang-blog.oss-cn-hangzhou.aliyuncs.com/blog/2022/10/image-86.png)
添加TransactionManager
![图片[4]-事务管理-深吸氧](https://xiyang-blog.oss-cn-hangzhou.aliyuncs.com/blog/2022/10/image-88.png)
在OpenSessionInViewFilter中进行事务管理(暂时不考虑事务传播机制)
![图片[5]-事务管理-深吸氧](https://xiyang-blog.oss-cn-hangzhou.aliyuncs.com/blog/2022/10/image-89-1024x500.png)
注意:在jdbc操作中不要关闭连接
![图片[6]-事务管理-深吸氧](https://xiyang-blog.oss-cn-hangzhou.aliyuncs.com/blog/2022/10/image-90.png)
© 版权声明
THE END
暂无评论内容