关于java:JPA事务中的异常最后不也抛出了为什么没被catch到而导致回滚

42次阅读

共计 913 个字符,预计需要花费 3 分钟才能阅读完成。

上周,咱们通过这篇文章《为什么 catch 了异样,但事务还是回滚了?》来解释了,之前 test4 为什么会回滚的起因。

但还是收到了很多没有了解的反馈,次要是依据前文给出的线索去跟踪,是取得到了回滚的标示和异样,而让大家不了解的是,javax.validation.ConstraintViolationException异样不是最初也向外抛出了,那么为什么 test4 里 catch 没有可能捕捉到呢?

其实这个问题并不难解释,上面就通过这篇文章,做个小试验,帮忙大家进一步了解大家的这个疑难!

如果你还不理解这篇文章在探讨什么,倡议先看之前的两篇:

  • 《我来出个题:这个事务会不会回滚?》
  • 《为什么 catch 了异样,但事务还是回滚了?》

入手尝试一下

因为 @Transactional 注解的事务是通过切面来实现的,所以要通过源码去理解整个过程,可能还是不容易了解。

所以,这里教大家一个简略办法来了解这次 test4 的 catch 为什么没有捕捉异样。

咱们通过相似上面的形式,给 test4 多加一些日志信息和断点:

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

而后尝试触发 test4 的执行,通过 DEBUG,咱们都能够察看到:

test4 中咱们加的断点,除了 47 行没进入,其余的一次性都执行完了。而后才进入了 org.springframework.orm.jpa.JpaTransactionManagerdoCommit办法。

所以,前文中咱们跟踪的事务回滚所抛出的异样,其实是在 test4 中的 try-catch 块执行完之后才抛出的,所以外部的这个 catch 是无奈捕捉异样的,这里齐全就是 catch 了个寂寞。

通过日志,咱们也能察看到这样的执行程序:

好了,通过这样来看,是不是要比之前有进一步的了解了呢?如果您还想跟深刻的理解事务的底层运行机制,肯定要 debug 一下源码,本人过一遍,了解会粗浅哦!如果你还有其余疑难,欢送退出咱们的 Spring 技术交换群,参加交换与探讨,一起学习与提高!如果您正在学习 Spring Boot,我的收费教程始终在继续连载,欢送关注 Spring Boot 2.x 基础教程。

欢送关注我的公众号:程序猿 DD,分享其余中央看不到的常识与思考

正文完
 0