知识卡片
近未来读要回滚
内容
当读事务遇到比自己时间戳略大的版本,可能是时钟偏斜造成的真实后发事务;CockroachDB 会回滚而非读历史。发散:MVCC 读旧版本很方便,但遇到接近时钟误差边界时,安全比继续执行更重要。
参考来源
- 位置:《分布式系统与一致性》第9章《分布式数据库CockroachDB》时间戳与时钟偏差一节(源文件:_epub-src/OEBPS/Text/chapter13.xhtml)
- 结论依据:原文明确当"TS(key)比TS(reader)大得不是很多,也就是事务T遇到一个比较近的将来时间戳……由于无法确定事务启动的真正时间,因此就无法确定是读取最新值,还是通过MVCC读取历史版本,所以统一按照不允许执行来处理",即回滚而非直接读历史版本。
- 原始内容:在上面的例子中,key的时间戳TS(key)与reader的时间戳TS(reader)的差值小于250ms,则这个key的时间戳为比较近的将来时间戳(near future)。所以要防止陈旧读,就需要阻止例子中事务T2的执行,即将事务T2回滚……由于无法确定事务启动的真正时间,因此就无法确定是读取最新值,还是通过MVCC读取历史版本,所以统一按照不允许执行来处理。