@Transactional标注的公共方法调用私有方法,事务是否生效?
问题解答:私有方法的数据库查询是否在事务中执行
这段代码完全可行,私有方法mPrivate()里的数据库查询会在mPublic()开启的只读事务中执行。
原因很直接:Spring事务基于动态代理实现,当调用被@Transactional(readOnly = true)标记的公共方法mPublic()时,Spring会通过代理对象在方法执行前开启只读事务。而mPrivate()是在mPublic()内部直接调用的,属于同一个线程内的方法调用,全程处于mPublic()已经开启的事务上下文中,所以里面的数据库操作自然会纳入事务管理。
额外提醒两个关键点:
- 如果直接调用私有方法(不走被事务注解标记的公共方法入口),那私有方法里的操作不会有事务支持
- 别给私有方法加
@Transactional注解,Spring的动态代理机制不会处理私有方法上的事务注解,加了也是无效的
内容的提问来源于stack exchange,提问作者Pup
相关产品推荐
相关产品推荐

