群友:事务中的异常不也抛出了,为什么没catch到而回滚?
上周,我们通过这篇文章《为什么catch了异常,但事务还是回滚了?》(https://blog.didispace.com/why-catch-exception-transaction-rollback/)来解释了,之前test4为什么会回滚的原因。
但还是收到了很多没有理解的反馈,主要是根据前文给出的线索去跟踪,是获得到了回滚的标示和异常,而让大家不理解的是,javax.validation.ConstraintViolationException
异常不是最后也向外抛出了,那么为什么test4里catch没有能够捕获到呢?
其实这个问题并不难解释,下面就通过这篇文章,做个小实验,帮助大家进一步理解catch不到异常的原因!
如果你还不了解这篇文章在讨论什么,建议先看之前的两篇:
《我来出个题:这个事务会不会回滚?》(https://blog.didispace.com/will-this-transcation-rollback/)
《为什么catch了异常,但事务还是回滚了?》(https://blog.didispace.com/why-catch-exception-transaction-rollback/)
动手尝试一下
由于@Transactional
注解的事务是通过切面来实现的,所以要通过源码去了解整个过程,可能还是会比较晕。
所以,这里教大家一个简单方法来理解这次test4的catch为什么没有捕获异常。
我们通过类似下面的方式,给test4多加一些日志信息和断点:
同时,记得也在上一篇说到的事务提交入口,也加上断点。
org.springframework.orm.jpa.JpaTransactionManager
然后尝试触发test4的执行,通过DEBUG,我们都可以观察到:
test4中我们加的断点,除了47行没进入,其他的一次性都执行完了。然后才进入了org.springframework.orm.jpa.JpaTransactionManager
的doCommit
方法。
所以,前文中我们跟踪的事务回滚所抛出的异常,其实是在test4中的try-catch块执行完之后才抛出的,所以内部的这个catch是无法捕获异常的,这里完全就是catch了个寂寞。
通过日志,我们也能观察到这样的执行顺序:
好了,通过这样来看,是不是要比之前有进一步的理解了呢?如果您还想更深入的了解事务的底层运行机制,一定要debug下源码,自己过一遍,理解会深刻哦!如果你没有得到跟我一样的结果,那更要找找原因,除了审题之外,再仔细跟踪下执行过程,这么做远比下面这样要得到更多收获哦~
如果你还有其他疑问,关注下方公众号,回复”加群“,加入我们的Spring技术交流群,参与交流与讨论,一起学习与进步!
如果您正在学习Spring Boot,我的免费教程一直在持续连载,欢迎关注我们长期连载的Spring Boot 2.x基础教程:http://blog.didispace.com/spring-boot-learning-2x/
往期推荐
Spring发布新成员:Spring GraphQL!高调出场的GraphQL能火起来了吗?
推荐一本DD刚撸完的书,顺便送一波!
GitHub的AI写代码翻车了,会在注释里给你写上what the f***,因为...
重装IDEA再也不愁了,一招搞定同步个人配置!
用办公电脑存不雅视频,结果被告了...
群友:事务中的异常不也抛出了,为什么没catch到而回滚?相关推荐
- mysql事务管理及spring声明式事务中主动异常抛出使数据库回滚
mysql事务管理及spring声明式事务中主动异常抛出使数据库回滚 参考文章: (1)mysql事务管理及spring声明式事务中主动异常抛出使数据库回滚 (2)https://www.cnblog ...
- WCF客户端不能用在Using语句块中,因为它可能会抛出不可预知的异常。即使你捕获了异常,仍有可能一直保持连接。...
WCF客户端不能用在Using语句块中,因为它可能会抛出不可预知的异常.即使你捕获了异常,仍有可能一直保持连接.让我们来看看形成这一问题的历史原因,并提出几个补救措施. 在.NET中,资源管理的基础就 ...
- Spring事务异常回滚,try catch 捕获异常不回滚
Spring事务异常回滚,try catch 捕获异常不回滚 参考文章: (1)Spring事务异常回滚,try catch 捕获异常不回滚 (2)https://www.cnblogs.com/GH ...
- java中在方法体内抛出异常_Java异常处理中___用于方法体内,抛出一个异常对象。...
Java异常处理中___用于方法体内,抛出一个异常对象. 答: throw; 智慧职教: 运输高致病性动物病原微生物菌(毒)种或者样本的,与内包装要求错误的是 答:E.主容器表面标注"高致病 ...
- 【C++ 语言】异常 ( 抛出字符串异常 | 抛出异常对象 | 抛出任意对象 | 抛出自定义异常 )
文章目录 I 异常处理 II 字符串异常 III 异常对象 IV 抛出任意类型对象 V 自定义异常 VI 异常相关代码 I 异常处理 1. 异常处理 : 使用 " try{}catch(){ ...
- oracle异常抛出,ORACLE 存储过程异常捕获并抛出
for tab_name in tables loop execute immediate 'drop table '||tab_name; --此处可能会报错 end loop; 当前情况是,循环表 ...
- 【C++ 语言】异常 ( 抛出字符串异常 | 抛出异常对象 | 抛出任意对象 | 抛出自定义异常 )
转载自:https://blog.csdn.net/shulianghan/article/details/100002073 文章目录 I 异常处理 II 字符串异常 III 异常对象 IV 抛出任 ...
- ORACLE 存储过程异常捕获并抛出
ORACLE 存储过程异常捕获并抛出 参考文章: (1)ORACLE 存储过程异常捕获并抛出 (2)https://www.cnblogs.com/wdw31210/p/7009731.html 备忘 ...
- 异常0xc000041d的抛出过程
异常0xc000041d的抛出过程 参考文章: (1)异常0xc000041d的抛出过程 (2)https://www.cnblogs.com/yilang/p/12028082.html 备忘一下.
最新文章
- docker对aufs触发的bug
- 数据库获取的字符串按照逗号分隔,放进数组集合中
- postgresql 备份_PostgreSQL的备份与恢复
- 使用CDS view开发SAP Marketing contact的facet追溯工具
- python(3)-动态参数实现字符串格式化
- Docker:集装箱式“运输”在软件上的实现
- 动态规划问题之背包模型(18题)
- 添加删除 板块 struts2
- ASP.NET 5 Beta8 已经发布
- 实战:布隆过滤器安装与使用及原理分析
- Redis进阶篇主从复制----哨兵模式
- 【Spark】Spark基本概念
- java中删除特定后缀名文件
- (转)基于MVC4+EasyUI的Web开发框架形成之旅--总体介绍
- python爬去segementfault上的博客文章
- android excel读取和写入_Python科普帖 csv amp; excel
- vue个人学习(三)----组件
- 程序员吐槽:互联网就是高薪富士康,还不如在事业单位混日子
- CentOS7安装vmware tools时出现Searching for a valid kernel header path… The path “” is not valid错误
- 事实表 的指标 维度表_数据库-事实表和维度表之间的区别?