基于时间戳的分布式事务如何保证可重复读?以CockroachDB为例
CockroachDB基于时间戳的分布式事务如何保证可重复读?
CockroachDB依靠全局一致的时间戳和多版本数据存储实现可重复读隔离级别,核心逻辑可拆解为以下几点:
1. 事务的固定读时间戳机制
每个事务在启动(或首次执行读取操作)时,会被分配一个固定不变的读时间戳。整个事务周期内,所有读取操作都基于该时间戳执行——只读取提交时间戳小于等于当前事务读时间戳的已提交数据版本。
2. 针对你提出的场景分析
你的场景:T1启动时间早于T2(T1<T2),T1修改x但未提交时T2读不到修改;后续T1提交后,T2再次读x是否会引发不可重复读?
答案是不会,原因如下:
- T2启动时已确定读时间戳,此时T1未提交,其对x的修改属于无有效提交时间戳的未提交版本,T2读取x时只能看到自身读时间戳之前已提交的版本,符合预期。
- T1提交时会被分配一个提交时间戳(该时间戳必然晚于T1启动时间,且大概率晚于T2的读时间戳)。但T2的读时间戳固定不变,后续读取x仍会基于最初的读时间戳筛选版本——T1的提交时间戳大于T2的读时间戳,因此T2看不到T1提交后的x版本,两次读取结果一致,不会触发不可重复读。
3. 多版本存储的支撑
CockroachDB为每个数据项维护多个版本,每个版本绑定唯一的提交时间戳。读取时系统会自动筛选出符合当前事务读时间戳的最新有效版本,确保事务内读取的一致性。
内容的提问来源于stack exchange,提问作者xiaowei ye
相关产品推荐
相关产品推荐

