上周,我们通过这篇文章《为什么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.JpaTransactionManagerdoCommit方法。

所以,前文中我们跟踪的事务回滚所抛出的异常,其实是在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到而回滚?相关推荐

  1. mysql事务管理及spring声明式事务中主动异常抛出使数据库回滚

    mysql事务管理及spring声明式事务中主动异常抛出使数据库回滚 参考文章: (1)mysql事务管理及spring声明式事务中主动异常抛出使数据库回滚 (2)https://www.cnblog ...

  2. WCF客户端不能用在Using语句块中,因为它可能会抛出不可预知的异常。即使你捕获了异常,仍有可能一直保持连接。...

    WCF客户端不能用在Using语句块中,因为它可能会抛出不可预知的异常.即使你捕获了异常,仍有可能一直保持连接.让我们来看看形成这一问题的历史原因,并提出几个补救措施. 在.NET中,资源管理的基础就 ...

  3. Spring事务异常回滚,try catch 捕获异常不回滚

    Spring事务异常回滚,try catch 捕获异常不回滚 参考文章: (1)Spring事务异常回滚,try catch 捕获异常不回滚 (2)https://www.cnblogs.com/GH ...

  4. java中在方法体内抛出异常_Java异常处理中___用于方法体内,抛出一个异常对象。...

    Java异常处理中___用于方法体内,抛出一个异常对象. 答: throw; 智慧职教: 运输高致病性动物病原微生物菌(毒)种或者样本的,与内包装要求错误的是 答:E.主容器表面标注"高致病 ...

  5. 【C++ 语言】异常 ( 抛出字符串异常 | 抛出异常对象 | 抛出任意对象 | 抛出自定义异常 )

    文章目录 I 异常处理 II 字符串异常 III 异常对象 IV 抛出任意类型对象 V 自定义异常 VI 异常相关代码 I 异常处理 1. 异常处理 : 使用 " try{}catch(){ ...

  6. oracle异常抛出,ORACLE 存储过程异常捕获并抛出

    for tab_name in tables loop execute immediate 'drop table '||tab_name; --此处可能会报错 end loop; 当前情况是,循环表 ...

  7. 【C++ 语言】异常 ( 抛出字符串异常 | 抛出异常对象 | 抛出任意对象 | 抛出自定义异常 )

    转载自:https://blog.csdn.net/shulianghan/article/details/100002073 文章目录 I 异常处理 II 字符串异常 III 异常对象 IV 抛出任 ...

  8. ORACLE 存储过程异常捕获并抛出

    ORACLE 存储过程异常捕获并抛出 参考文章: (1)ORACLE 存储过程异常捕获并抛出 (2)https://www.cnblogs.com/wdw31210/p/7009731.html 备忘 ...

  9. 异常0xc000041d的抛出过程

    异常0xc000041d的抛出过程 参考文章: (1)异常0xc000041d的抛出过程 (2)https://www.cnblogs.com/yilang/p/12028082.html 备忘一下.

最新文章

  1. docker对aufs触发的bug
  2. 数据库获取的字符串按照逗号分隔,放进数组集合中
  3. postgresql 备份_PostgreSQL的备份与恢复
  4. 使用CDS view开发SAP Marketing contact的facet追溯工具
  5. python(3)-动态参数实现字符串格式化
  6. Docker:集装箱式“运输”在软件上的实现
  7. 动态规划问题之背包模型(18题)
  8. 添加删除 板块 struts2
  9. ASP.NET 5 Beta8 已经发布
  10. 实战:布隆过滤器安装与使用及原理分析
  11. Redis进阶篇主从复制----哨兵模式
  12. 【Spark】Spark基本概念
  13. java中删除特定后缀名文件
  14. (转)基于MVC4+EasyUI的Web开发框架形成之旅--总体介绍
  15. python爬去segementfault上的博客文章
  16. android excel读取和写入_Python科普帖 csv amp; excel
  17. vue个人学习(三)----组件
  18. 程序员吐槽:互联网就是高薪富士康,还不如在事业单位混日子
  19. CentOS7安装vmware tools时出现Searching for a valid kernel header path… The path “” is not valid错误
  20. 事实表 的指标 维度表_数据库-事实表和维度表之间的区别?

热门文章

  1. hibernate的native sql查询
  2. linux下的getopts
  3. IT认证不归路、CCIE高失业率
  4. 错误中积累经验,BUG中寻发展,总结中提升
  5. linux shell curl 超时与重试
  6. telegram bot 机器人 发送 加粗 斜体 字体
  7. python 单一进程实例 实现
  8. java 使用 idea 调试 ysoserial
  9. python3 windows环境 安装加密库 crypto
  10. KVM-Qemu-Libvirt三者之间的关系