JPA中@Transactional方法内混用只读仓库方法与写操作的疑问
JPA中@Transactional方法内混用只读仓库方法与写操作的疑问
嗨,我来帮你捋清楚这个场景下的两个问题:
问题1:主从架构下的路由与风险
首先要明确:当你给整个方法标注了@Transactional(默认是读写事务,readOnly=false),这个事务的属性优先级是高于仓库单个方法的readOnly=true标记的。
如果你的系统配置了主从复制的数据源路由,通常路由策略是绑定当前事务的属性来选节点:
- 整个方法启动时,就会创建一个读写事务,直接绑定到主库
- 哪怕你调用的
findAllByXYZ是仓库级别的只读方法,它也会在这个已有的读写事务里执行,不会切换到从库
所以不会出现「读从库、写主库」的情况,也就不会有数据一致性的风险(比如刚写完主库,从库还没同步就读到旧数据)。但这里的仓库只读标记相当于“无效”了,你没法享用到从库读的性能优化。
问题2:无副本单库场景下的安全性
完全安全,放心用就行!
在单库场景下,readOnly=true的标记只是给JPA和数据库做性能优化用的:
- JPA会跳过实体的脏数据检查,减少不必要的操作
- 数据库可能会针对只读查询启用执行计划优化或者缓存
它不会改变事务的ACID特性,不管是只读查询还是后续的save写操作,都在同一个事务里,数据的一致性和完整性都能得到保证。
备注:内容来源于stack exchange,提问作者GreedyHat
相关产品推荐
相关产品推荐

