2

我可以从这段代码中得到的结果是否有所不同:

query = MyModel.all(keys_only=True).filter('myFlag', True)
keys = list(query)
models = db.get(keys)

与此代码相比:

query = MyModel.all().filter('myFlag', True)
models = list(query)

即,models两者都一样吗?

如果不是,为什么不呢?我曾认为最终一致性用于描述模型索引如何需要一段时间才能更新,因此可能与最近写入的数据不一致。

但是我最近遇到了一个案例,我实际上是从第二个查询中获取过时的数据,其中model.myFlagTrue通过查询检索到的模型,但是False当我实际上是通过键获取模型时。

那么在这种情况下,数据myFlag来自哪里?

是不是通过键获取实体可以确保跨数据存储节点进行复制并返回最新数据,而通过查询获取实体只是从最近的数据存储节点检索数据?

编辑: 我阅读了这篇文章,并假设 Cloud Datastore 与 Appengine Datastore 的工作方式相同,我的问题的答案是肯定的,从查询返回的实体可能具有陈旧的值。

https://cloud.google.com/developers/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore#h.tf76fya5nqk8

4

1 回答 1

2

是的,正如您提到的,查询可能会返回陈旧的值。执行查询时,数据存储选择性能而不是一致性。

更深入:对于实体组,每个节点都有一个尚未应用的写入日志。当您执行读取或祖先查询时,所涉及的实体组首先应用其日志。但是,当您执行普通查询时,结果可能来自任何实体组,因此实体组不会被赶上。但是请注意使用第一个代码示例,用于实际查找这些实体的索引可能不是最新的。所以很有可能不会让所有实体都使用myFlag = True. 如果您有兴趣,我建议您阅读Megastore 论文

于 2014-02-12T17:51:13.713 回答