当Transactional碰到锁,有个大坑,要小心。 (9)

if (!shouldCommitOnGlobalRollbackOnly() && defStatus.isGlobalRollbackOnly())

前面的 shouldCommitOnGlobalRollbackOnly 默认为 false:

当Transactional碰到锁,有个大坑,要小心。

问题就精简为了:defStatus.isGlobalRollbackOnly() 为什么是true?

为什么?

因为 sellProductBiz 抛出异常后,会调用 completeTransactionAfterThrowing 方法执行回滚逻辑。

肯定是这个方法里面搞事情了啊。

org.springframework.transaction.support.AbstractPlatformTransactionManager#processRollback

当Transactional碰到锁,有个大坑,要小心。

在这里,把链接的 rollbackOnly 置为了 true。

所以,后面的事务想要 commit 的时候,一检查这个参数,哦豁,回滚吧。

大概就是这样的:

当Transactional碰到锁,有个大坑,要小心。

如果这不是你期望的异常,怎么解决呢?

理解了事务的传播机制就简单的一比:

当Transactional碰到锁,有个大坑,要小心。

就这样,新开个事务,跑起来没毛病,互不干扰。

当Transactional碰到锁,有个大坑,要小心。

最后说一句

好了,看到了这里安排个关注吧,周更原创很累的,需要一点正反馈。

感谢您的阅读,我坚持原创,十分欢迎并感谢您的关注。

我是 why,你也可以叫我小歪,一个主要写代码,经常写文章,偶尔拍视频的程序猿。

当Transactional碰到锁,有个大坑,要小心。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzdfsx.html