PostgreSQL主从+Spring Boot环境下,事务内未提交INSERT能否从从库读数据?
问题解答
首先明确结论:无论使用哪种事务传播特性,都无法从从库读取到未提交INSERT操作的记录,具体原因如下:
1. PostgreSQL主从复制的核心逻辑
PostgreSQL的主从复制是基于已提交事务的WAL(预写日志)同步实现的——只有当主库上的事务完成commit后,对应的WAL日志才会被发送到从库并回放。未提交的事务数据仅存在于主库当前事务的上下文里,既不会对主库的其他会话可见,更不会同步到从库。
2. 两种事务传播特性的实际行为
(1)Propagation.REQUIRED
这个传播特性会让只读事务直接加入外层的主事务,相当于整个操作都处于同一个未提交的事务中。此时如果你的Spring配置将只读事务路由到从库,从库根本不存在这条未提交的记录;哪怕没有路由,也是在主库的同一个事务内才能读到,但你要的是从库读取,所以肯定拿不到目标数据。
(2)Propagation.NESTED
嵌套事务是基于数据库的保存点(Savepoint)实现的,本质上仍依附于外层主事务,并没有独立提交。只要外层事务未执行commit,这条INSERT的数据就不会进入主库的已提交数据集,自然也不会同步到从库,从库查询必然返回空。
额外补充
如果想让从库读到这条记录,必须先执行主事务的commit,等主从复制完成(异步复制可能存在延迟,同步复制则会等待从库确认)后,才能在从库查询到目标记录。
内容的提问来源于stack exchange,提问作者seankim
相关产品推荐
相关产品推荐

