问题描述
文档 https://docs.yugabyte.com/latest/architecture/transactions/transactional-io-path/ 说分布式 txn 可以从其中一个涉及的平板电脑中选择 safe_time
,并且 safe_time
考虑第一个未提交的 raft 日志的混合时间戳。这是否意味着yugabytedb保证所有txn都可以读取启动前提交的txn写入的数据?
[免责声明]:这个问题最初是在 YugabyteDB 社区 Slack 频道上提出的。
解决方法
为快照隔离事务选择读取时间戳有两个组成部分:(1)它需要足够新以捕获事务开始之前已提交的所有内容; (2) 需要尽可能的低,避免不必要的等待。从事务读取或写入的第一个平板电脑中选择安全时间只是实现上述目标的一种启发式方法。安全时间认为该平板电脑的 Raft 日志中第一个未提交(在 Raft 意义上)记录的时间戳作为输入之一,而真正进入安全时间计算的是未提交的时间戳减去“epsilon”(最小可能的混合时间步)以便该记录提交不会改变截至此时间戳的数据视图(并且安全时间也受到平板电脑领导者的混合时间领导者租用的限制,因此我们可以安全地防止领导者更改和新领导者试图在领导租约到期后的新时间戳)。因此,以上所有内容都涉及“快照安全”(即,如果我们在某个时间读取 read_ht,我们保证不会对时间戳