spring中事务处理原理
利用aop生成代理对象执行带有Transactional事务注解的方法业务逻辑.项目启动过程中会生成代理对象并将Transactional注解中的属性进行解析加载处理.在方法执行过程中如果出现异常,会根据注解配置决定是进入到事务回滚处理还是事务提交处理逻辑中,事务回滚处理逻辑中最终还是基于数据库的事务回滚处理.
异常的分类
案例说明
以自定义异常为例说明一下@Transactional中是否指定rollbackFor=Exception.class的区别
未指定rollbackFor属性
1 2 3 4 5 6 7 8 9 10 |
|
指定rollbackFor属性
1 2 3 4 5 6 7 8 9 10 |
|
原因分析
其他帖子都说如果不加的话仅支持运行期异常以及error错误类型.对于非运行期异常是不支持的.这里提供一下这种说法的来源.
先看一下@Transactional注解中关于rollbackFor的使用说明
1 2 3 4 5 6 7 8 9 10 |
|
至于加上@Transactional中指定rollbackFor=Exception.class以后是如何起作用的接着往下看.
spring中事务回滚的大概逻辑是,发生异常之后,会根据配置的事务属性判断是否进行回滚的处理,如果不进行事务回滚则直接进行事务提交.这里重要的体现是在:TransactionAspectSupport.java中completeTransactionAfterThrowing
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
而判断事务是否支持回滚的处理在RuleBasedTransactionAttribute.java中transactionAttribute.rollbackOn()
1 2 3 4 5 6 7 8 9 10 11 |
|
DefaultTransactionAttribute.java中rollbackOn,是否支持事务回滚的默认判断方式:是否是运行期异常或是是否是错误类型(与Transactional注解中的rollbackFor属性说明相对应).
1 2 3 |
|
RollbackRuleAttribute中如何进行的赋值问题,具体来讲是项目启动之后会扫描带有Transactional注解的方法,然后将注解中标注的属性获取之后进行参数配置.具体体现是在:SpringTransactionAnnotationParser.java中parseTransactionAnnotation
1 2 3 4 5 6 7 8 9 10 11 12 |
|
至此关于为什么@Transactional为什么要添加rollbackFor=Exception.class原因以讲述完毕!
到此这篇关于spring事务管理@Transactional为什么要添加rollbackFor=Exception.class的文章就介绍到这了,更多相关spring事务管理@Transactional内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章:
- 解决SpringBoot中使用@Transactional注解遇到的问题
- 一文搞懂spring boot本地事务@Transactional参数
- spring声明式事务 @Transactional 不回滚的多种情况以及解决方案
- 基于Spring中的事务@Transactional细节与易错点、幻读
- Spring中@Transactional(rollbackFor=Exception.class)属性用法介绍
- spring中12种@Transactional的失效场景(小结)
- spring声明式事务@Transactional底层工作原理
- Spring中的@Transactional的工作原理
来源:https://www.jb51.net/article/229184.htm
原创文章,作者:745907710,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/271846.html