关于YugabyteDB中safe_time使用的澄清问询
YugabyteDB safe_time 读取一致性问题解答
请问分布式事务从关联 tablets 选取
safe_time,且safe_time参考首个未提交 raft log 的混合时间戳的设计,是否意味着 YugabyteDB 可保证所有事务均能读取到其启动前已提交事务写入的数据?
首先给出明确结论:是的,该设计正是为了实现这项一致性保证,在YugabyteDB默认的快照隔离、以及更高的可串行化隔离级别下,该承诺始终成立。
核心实现逻辑说明
- 每个 tablet 的
safe_time取当前 Raft 日志队列中首个未提交日志的混合时间戳(HLC)的前值,所有时间戳小于safe_time的事务都已经完成 Raft 多数派提交,变更已持久化对后续读操作可见。 - 分布式事务启动时会先获取全局唯一的启动时间戳,执行读取操作时,会从本次读取涉及的所有关联 tablet 分别拉取各自的
safe_time,取所有safe_time的最小值作为本次读取的快照时间边界。只要事务启动时间戳小于这个边界,就能完整获取所有事务启动前已提交的写入数据。 - 这套机制从底层规避了脏读、不可重复读问题,确保事务的所有读取操作都对应全局一致的时间快照,不会遗漏事务启动前任何已提交的写入结果。
内容的提问来源于stack exchange,提问作者MarkoR
相关产品推荐
相关产品推荐

