JPA事务中的异常最后不也抛出了,为什么没被catch到而导致回滚?
上周,我们通过这篇文章《为什么catch了异常,但事务还是回滚了?》来解释了,之前test4为什么会回滚的原因。
但还是收到了很多没有理解的反馈,主要是根据前文给出的线索去跟踪,是获得到了回滚的标示和异常,而让大家不理解的是,javax.validation.ConstraintViolationException
异常不是最后也向外抛出了,那么为什么test4里catch没有能够捕获到呢?
其实这个问题并不难解释,下面就通过这篇文章,做个小实验,帮助大家进一步理解大家的这个疑问!
如果你还不了解这篇文章在讨论什么,建议先看之前的两篇:
动手尝试一下
由于@Transactional
注解的事务是通过切面来实现的,所以要通过源码去了解整个过程,可能还是不容易理解。
所以,这里教大家一个简单方法来理解这次test4的catch为什么没有捕获异常。
我们通过类似下面的方式,给test4多加一些日志信息和断点:
同时,记得也在上一篇说到的事务提交入口,也加上断点。
然后尝试触发test4的执行,通过DEBUG,我们都可以观察到:
test4中我们加的断点,除了47行没进入,其他的一次性都执行完了。然后才进入了org.springframework.orm.jpa.JpaTransactionManager
的doCommit
方法。
所以,前文中我们跟踪的事务回滚所抛出的异常,其实是在test4中的try-catch块执行完之后才抛出的,所以内部的这个catch是无法捕获异常的,这里完全就是catch了个寂寞。
通过日志,我们也能观察到这样的执行顺序:
好了,通过这样来看,是不是要比之前有进一步的理解了呢?如果您还想跟深入的了解事务的底层运行机制,一定要debug一下源码,自己过一遍,理解会深刻哦!如果你还有其他疑问,欢迎加入我们的Spring技术交流群,参与交流与讨论,一起学习与进步!如果您正在学习Spring Boot,我的免费教程一直在持续连载,欢迎关注Spring Boot 2.x基础教程。
欢迎关注我的公众号:程序猿DD,分享外面看不到的干货!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
带你深入理解Java的IO到底是个啥
摘要:操作系统就是管家,电脑的设备就是资源,如果进程先要操作资源,必须要进行系统调用,有操作系统去处理,然后再返回给进程,这样的代理模式是不是很常见?因此app 就是你写的程序,资源就是硬盘或者其他的设备,io就是进行的系统调用。 本文分享自华为云社区《惊呆了,原来JavaIO如此简单》,原文作者:香菜聊游戏。 操作系统就是管家,电脑的设备就是资源,如果进程先要操作资源,必须要进行系统调用,有操作系统去处理,然后再返回给进程,这样的代理模式是不是很常见?因此app 就是你写的程序,资源就是硬盘或者其他的设备,io就是进行的系统调用。 为了保证操作系统的稳定性和安全性,一个进程的地址空间划分为用户空间(User space)和内核空间(Kernel space )。像我们平常运行的应用程序都是运行在用户空间,只有内核空间才能进行系统态级别的资源有关的操作,比如如文件管理、进程通信、内存管理等等。也就是说,我们想要进行 IO 操作,一定是要依赖内核空间的能力。并且,用户空间的程序不能直接访问内核空间。当想要执行 IO 操作时,由于没有执行这些操作的权限,只能发起系统调用请求操作系统帮忙完成...
- 下一篇
Redis 内存压缩实战,学习了!
作者:Xie Zefan<br> 来源:https://xiezefan.me/2017/05/01/redis_in_action_ziplist/ 在讨论Redis内存压缩的时候,我们需要了解一下几个Redis的相关知识。 压缩列表 ziplist Redis的ziplist是用一段连续的内存来存储列表数据的一个数据结构,它的结构示例如下图 压缩列表组成示例--截图来自《Redis设计与实现》 zlbytes: 记录整个压缩列表使用的内存大小 zltail: 记录压缩列表表尾距离起始位置有多少字节 zllen: 记录压缩列表节点数量,值得注意的一点是,因为它只占了2个字节,所以最大值只能到65535,这意味着压缩列表长度大于65535的时候,就只能通过遍历整个列表来计算长度了 zleng: 压缩列表末端标志位,固定值为OxFF entry1-N: 压缩列表节点, 具体结构如下图 压缩列表节点组成示例--截图来自《Redis设计与实现》 其中 previous_entry_length: 上一个节点的长度 encoding: content的编码以及长度 content:...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,CentOS7官方镜像安装Oracle11G
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS8安装Docker,最新的服务器搭配容器使用
- Hadoop3单机部署,实现最简伪集群
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS关闭SELinux安全模块