【发布时间】:2014-02-12 14:56:37
【问题描述】:
我可以从这段代码中得到的结果是否有所不同:
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.myFlag 是 True 用于通过查询检索到的模型,但 False 当我实际上通过密钥获取模型时.
那么在这种情况下,myFlag 的数据来自哪里?
是不是通过 key 获取实体可以确保跨数据存储节点的复制并返回最新数据,而通过查询获取它只是从最近的数据存储节点检索数据?
编辑: 我阅读了这篇文章,假设 Cloud Datastore 与 Appengine Datastore 的工作方式相同,我的问题的答案是肯定的,从查询返回的实体可能具有陈旧的值。
【问题讨论】:
-
强调您的编辑是正确的,如果您想获得强一致性,请始终使用键或祖先查询。 @Patrick Costello 为您提供保障。
标签: python google-app-engine google-cloud-datastore eventual-consistency