Google app engine Appengine-在输入内容后立即查询数据库

Google app engine Appengine-在输入内容后立即查询数据库,google-app-engine,google-cloud-datastore,Google App Engine,Google Cloud Datastore,在代码的一个地方,我做了如下操作: FormModel(.. some data here..).put() 下面几行是我从数据库中选择的: FormModel.all().filter(..).fetch(100) 我注意到的问题-有时候提取没有注意到我刚才添加的数据 我的理论是,发生这种情况是因为我使用的是高复制存储,而我没有给它足够的时间来复制数据。但是我怎样才能避免这个问题呢 除非数据在同一实体组中,否则无法保证数据是最新的数据(如果我正确)。Shay是对的:无法知道数据存储何时准备

在代码的一个地方,我做了如下操作:

FormModel(.. some data here..).put()
下面几行是我从数据库中选择的:

FormModel.all().filter(..).fetch(100)
我注意到的问题-有时候提取没有注意到我刚才添加的数据


我的理论是,发生这种情况是因为我使用的是高复制存储,而我没有给它足够的时间来复制数据。但是我怎样才能避免这个问题呢

除非数据在同一实体组中,否则无法保证数据是最新的数据(如果我正确)。Shay是对的:无法知道数据存储何时准备好返回您刚才输入的数据

但是,您可以保证,一旦对
put
的调用成功完成,最终将输入数据。这是很多信息,你可以用它来解决这个问题。当您从
fetch
获取数据时,只需附加/插入您知道最终将在其中的新实体!我认为,在大多数情况下,在每个请求的基础上这样做就足够了,但您可以做一些更强大的事情,使用memcache覆盖所有请求(memcache失败的情况除外)

当然,最困难的部分是确定何时应该附加/插入哪些实体。不得不做这种变通办法是令人讨厌的,但为像人力资源部这样令人惊讶的复杂工作付出相对较低的代价。

此一致快照视图还扩展到写入后读取 内部交易。与大多数数据库不同,查询和获取 在数据存储内部,事务看不到上一个事务的结果 在该事务中写入。具体来说,如果修改了实体 或在事务中删除,查询或get返回原始 交易开始时实体的版本,或 如果实体当时不存在,则不存在任何内容


谢谢这似乎就是原因。我会把这个问题保留一天,以防有人提供某种方式来等待应用/强制应用。@Merlin,是的,保持开放,这是一个非常重要的问题,我自己也有一个项目,我不想迁移到HRD,除非有某种解决方案。你的回答与实际情况相反-强一致性仅在实体组中可用,不跨越它们-这仅适用于在实体组中使用祖先筛选器的情况。@NickJohnson为什么我的答案正好相反?我说它需要在同一个实体组是的,这是我的“计划B”-我更喜欢一个更精简的解决方案:)我认为这是目前存在的最好的解决方案。我可以想象一个库自动扫描最近的
put
实体,以便将其包含在查询中并获得结果,但我从未听说过它。