前言
最近在看spring事务源码,时不时回想起前几年面试YY的场景,面试官拿出下面的一道面试题问我,updateStatus方法会不会生成事务。我心想,这么简单的问题还要问我,这是瞧不起我的水平吗?但是我仔细看了看,想了想,这道题还真不容易回答,如果以前没有特别注意或者研究过,很容易掉坑里。还好我当时认真想了想,回答了不会生成事务,但后面面试官继续追问为什么不产生事务,我就把具体的原因说明了一下,事后回到家我再想了想这个问题,发现我回答的并不是很好。
对于从事java开发工作的同学来说,spring的事务肯定再熟悉不过了,上述的事务场景相信大家在工作中会遇到过,但是我们有没有认真研究呢,有多少人能够讲清楚updateStatus的事务问题呢,至少我当时回答的就不是很好。
确实,spring事务用起来贼爽,我们一般就用一个简单的注解:
Transactional,就能轻松搞定事务。我猜大部分小伙伴也是这样用的,而且一直用一直爽。但如果你使用不当,它也会坑你于无形。
今天我们就一起聊聊,事务失效的一些场景,说不定你已经中招了。不信,让我们一起看看。
一、事务不生效
1.访问权限问题
众所周知,java的访问权限主要有四种:public、protected、default、private,它们的权限从左到右,依次变小。
但如果我们把某些事务方法,定义了错误的访问权限级别,就会导致事务功能出问题,例如:
上面定义add方法的访问权限为private,这样最终会导致事务失效,spring要求被代理方法必须是public的。
想要了解代理方法必须是public的,我们需要看spring事务的源码,在AbstractFallbackTransactionAttributeSource类的