我一直在阅读谷歌斯皮纳和CockroachDB实现的只读无锁事务。两者都声称是通过使用系统时钟以无锁的方式实现的.在讨论这个问题之前,我的理解是(如果您知道这两个系统中的机器,或者仅仅在CockroachDB中),请跳过下面一节:
相关来源- https://www.cockroachlabs.com/blog/living-without-atomic-clocks/和https://static.googleusercontent.com/media/research.google.com/en//archive/spanner-osdi2012.pdf
考虑到此实现,CockroachDB是否保证以下两个事务不会出现串行化冲突?
例如,考虑到好友列表和帖子生活在不同的碎片上。然后发生以下排序(假设最大时钟错误为2)
现在,事务违反了序列化性,因为读取事务在同一事务中看到了旧写和新写。
我遗漏了什么?
发布于 2020-10-20 18:53:14
CockroachDB使用一种名为时间戳缓存的机制来处理这个问题(这是一个不幸的名称;它不是很大的缓存)。
在本例中,在第二步,当事务在时间戳7处读取好友列表时,持有好友列表的碎片记住它在t=7 (读取事务请求的时间戳,而不是存在的数据的最后修改的时间戳)上为该数据提供了读取,并且它不再允许使用较低的时间戳提交任何写入。
然后,在第三步中,当写入事务试图在t=6上写入和提交时,将检测到此冲突,并将写入事务的时间戳推送到t=8或更高版本。然后,该事务必须刷新其读取,以查看它是否可以按t=8处的情况提交。如果不能,则可能会返回错误,并且必须从一开始就重新尝试事务。
在第四步中,读取事务完成,看到在t=7中存在的数据的一致快照,而写入事务的两个部分在t=8中“在未来”。
https://stackoverflow.com/questions/64451468
复制相似问题