该案例违反因果律。 想象先生和夫人之间的对话:
Mr
Mrs,你能看到多远未来?
Mrs
通常约10s,Mr.
这两句之间有因果关系:夫人听到先生的问题并回答该问题。想象第三者老王在通过从节点听对话。 夫人说的内容是从一个延迟很低的从节点读取,但先生所说的内容,从节点的延迟要大的多,如图-5,于是该观察者会听到:
Mrs
通常约十秒钟,Mr
Mr
Mrs,你能看到多远未来?
对观察者来说,看起来好像夫人在先生发问前就回答了问题。
防止这种异常,需要新类型的保证:一致前缀读(consistent prefix reads),若一系列写入按某个顺序发生,那么任何人读取这些写入时,也会看见它们以同样的顺序出现。
这是分片数据库中的特殊问题。若数据库总以相同顺序写入,则读总会看到一致的序列,不会发生这种异常。许多分布式数据库中,不同分片独立运行,因此不存在全局写入顺序。这就导致,当用户从DB读数据时,可能会看到DB某些部分处于较旧状态,某些处于较新状态。
解决方案
确保任何具有因果顺序关系的写人都交给一个分片来完成,但该方案实际的实现效率大打折扣 。