Appengine - 在放入内容后立即查询数据库

时间:2011-11-17 14:17:41

标签: google-app-engine google-cloud-datastore

在一个代码处我做这样的事情:

FormModel(.. some data here..).put()

我从数据库中选择以下几行:

FormModel.all().filter(..).fetch(100)

我注意到的问题 - 有时候fetch不会注意到我刚刚添加的数据。

我的理论是,这是因为我正在使用高复制存储,而且我没有给它足够的时间来复制数据。但是我怎么能避免这个问题呢?

3 个答案:

答案 0 :(得分:3)

除非数据在同一个实体组中,否则无法保证数据最适合数据(如果我understand this section正确)。

答案 1 :(得分:2)

Shay是对的:无法知道数据存储区何时准备好返回刚输入的数据。

但是, 保证在put的调用成功完成后,最终输入数据。这是很多信息,您可以使用它来解决这个问题。当您从fetch获取数据时,只需追加/插入您知道将在那里的新实体!在大多数情况下,我认为,基于每个请求执行此操作已经足够好了,但是你可以做一些更强大的功能,使用memcache来覆盖所有请求(除了memcache失败的情况)。

当然,困难的部分是确定何时应该追加/插入哪些实体。不得不采用这种解决办法,但付出与HRD一样惊人复杂的东西的代价相对较低。

答案 2 :(得分:0)

来自https://developers.google.com/appengine/docs/java/datastore/transactions#Java_Isolation_and_consistency

  

此一致快照视图还扩展到写入后的读取   内部交易。与大多数数据库,查询和获取不同   在数据存储区事务内部看不到以前的结果   在该交易中写道。 具体而言,如果实体被修改   或在事务中删除,查询或获取返回原始   截至交易开始时的实体版本,或   如果实体当时不存在则没有。