上周,我们通过这篇文章《为什么catch了异常,但事务还是回滚了?》来解释了,之前test4为什么会回滚的原因。
但还是收到了很多没有理解的反馈,主要是根据前文给出的线索去跟踪,是获得到了回滚的标示和异常,而让大家不理解的是,javax.validation.ConstraintViolationException异常不是最后也向外抛出了,那么为什么test4里catch没有能够捕获到呢?
其实这个问题并不难解释,下面就通过这篇文章,做个小实验,帮助大家进一步理解大家的这个疑问!
如果你还不了解这篇文章在讨论什么,建议先看之前的两篇:
- 《我来出个题:这个事务会不会回滚?》
- 《为什么catch了异常,但事务还是回滚了?》
动手尝试一下
由于@Transactional注解的事务是通过切面来实现的,所以要通过源码去了解整个过程,可能还是不容易理解。
所以,这里教大家一个简单方法来理解这次test4的catch为什么没有捕获异常。
我们通过类似下面的方式,给test4多加一些日志信息和断点:

同时,记得也在上一篇说到的事务提交入口,也加上断点。

然后尝试触发test4的执行,通过DEBUG,我们都可以观察到:
test4中我们加的断点,除了47行没进入,其他的一次性都执行完了。然后才进入了org.springframework.orm.jpa.JpaTransactionManager的doCommit方法。
所以,前文中我们跟踪的事务回滚所抛出的异常,其实是在test4中的try-catch块执行完之后才抛出的,所以内部的这个catch是无法捕获异常的,这里完全就是catch了个寂寞。
通过日志,我们也能观察到这样的执行顺序:
:https://www.ikjzd.com/articles/126883
人妻一边接电话一边被我干 人妻美妇疯狂迎合:http://lady.shaoqun.com/m/a/247062.html
强壮的公么征服我厨房 我在洗碗他在下面弄我:http://www.30bags.com/m/a/249935.html
男朋友公车猛烈的一进一出 又硬又粗又长爽死我了:http://www.30bags.com/m/a/249719.html
女海王阵型!不告诉男朋友就勾搭富二代!数百万粉丝,Tik Tok女人,网络名人,做了很多轮:http://lady.shaoqun.com/a/410933.html
清迈的一个天桥小舒林成同志,被居民举报:http://lady.shaoqun.com/a/410934.html
女人为什么选择"暧昧"?倾听中年妇女的心声:http://lady.shaoqun.com/a/410935.html
独立站高昂流量成废品,如何操作才能起死回生?(上):https://www.ikjzd.com/articles/146487
No comments:
Post a Comment