博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring @Transactional ——事务回滚
阅读量:5286 次
发布时间:2019-06-14

本文共 1186 字,大约阅读时间需要 3 分钟。

工作原理

运行配置@Transactional注解的测试类的时候,具体会发生如下步骤
1)事务开始时,通过AOP机制,生成一个代理connection对象,并将其放入DataSource实例的某个与DataSourceTransactionManager相关的某处容器中。在接下来的整个事务中,客户代码都应该使用该connection连接数据库,执行所有数据库命令[不使用该connection连接数据库执行的数据库命令,在本事务回滚的时候得不到回滚]
2)事务结束时,回滚在第1步骤中得到的代理connection对象上执行的数据库命令,然后关闭该代理connection对象
根据上面所述,我们所使用的客户代码应该具有如下能力:
1)每次执行数据库命令的时候
如果在事务的上下文环境中,那么不直接创建新的connection对象,而是尝试从DataSource实例的某个与DataSourceTransactionManager相关的某处容器中获取connection对象;在非事务的上下文环境中,直接创建新的connection对象
2)每次执行完数据库命令的时候
如果在事务的上下文环境中,那么不直接关闭connection对象,因为在整个事务中都需要使用该connection对象,而只是释放本次数据库命令对该connection对象的持有;在非事务的上下文环境中,直接关闭该connection对象

 

 

在service类前加上@Transactional,声明这个service所有方法需要事务管理。每一个业务方法开始时都会打开一个事务。

Spring默认情况下会对运行期例外(RunTimeException)进行事务回滚。这个例外是unchecked

如果遇到checked意外就不回滚。

如何改变默认规则:

1 让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class)

2 让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)

3 不需要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)

4 如果不添加rollbackFor等属性,Spring碰到Unchecked Exceptions都会回滚,不仅是RuntimeException,也包括Error。

 

注意: 如果异常被try{}catch{}了,事务就不回滚了,如果想让事务回滚必须再往外抛try{}catch{throw Exception}。

 

转载于:https://www.cnblogs.com/0201zcr/p/4678649.html

你可能感兴趣的文章
解决Flash和html在多标签浏览器中互访问题
查看>>
(转)菜鸟去重复之Sql
查看>>
git 使用注意事项
查看>>
ICND1(笔记2)
查看>>
XML Schema 是什么
查看>>
SharePoint、MOSS怎么给匿名用户操作列表的权限
查看>>
不能重写的方法
查看>>
Linux 常用命令记录
查看>>
Codeforces Round #316 (Div. 2)
查看>>
找出空的文件夹(OS X)
查看>>
PHP定时执行
查看>>
jTemplates用法
查看>>
Leetcode-Intersection of Two Linked Lists
查看>>
LeetCode-Max Sum of Rectangle No Larger Than K
查看>>
Python:Urllib库使用
查看>>
将时间戳转化为时间格式
查看>>
炉石传说JJC英雄简评 && JJC combo收集:Ver 1.0
查看>>
[LeetCode] First Bad Version
查看>>
Java面向对象编程之异常处理机制
查看>>
Java 学习 day02
查看>>