上周,咱们通过这篇文章《为什么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了个寂寞。
通过日志,咱们也能察看到这样的执行程序:
好了,通过这样来看,是不是要比之前有进一步的了解了呢?如果您还想跟深刻的理解事务的底层运行机制,肯定要debug一下源码,本人过一遍,了解会粗浅哦!如果你还有其余疑难,欢送退出咱们的Spring技术交换群,参加交换与探讨,一起学习与提高!如果您正在学习Spring Boot,我的收费教程始终在继续连载,欢送关注Spring Boot 2.x基础教程。
欢送关注我的公众号:程序猿DD,分享其余中央看不到的常识与思考