Google App Engine:关闭 .put() 和 .get() 竞争条件



我通过entity.put()将一些数据放入数据存储中,然后不久之后通过.get()从数据存储中读取(获取包含刚刚放置实体的数据)。

.get() 数据是正确的,但通常它的顺序没有意义:

SELECT * FROM entityName
WHERE someThing = 'value'
ORDER BY votes DESC, lastTouchedTimestamp DESC

将返回正确的实体(更新以包含来自上述 .put() 的新数据),但顺序不正确(即投票和/或 lastTouchedTimestamp 实际上不是顺序)

GAE 的新手,如果我忽略了一些简单的事情,很抱歉。

编辑/添加:

每个实体都有一个投票整数。 SELECT 应按投票顺序返回实体,例如:10,8,7,7,1,但有时返回 10,7,8,7,1。

您描述的是 App Engine 术语,不是 .get() 调用,而是查询。 正确的 .get() 调用指定了一个键,不受此争用的影响。 (祖先查询也不是。 有关此主题的更多背景信息,请阅读 https://developers.google.com/appengine/docs/python/datastore/overview#Datastore_Writes_and_Data_Visibility

您很幸运,您在查询结果中获得了更新的实体 - 这是因为在 .put() 调用之前存在的实体仍然与查询匹配。 你在实体中获取正确的值,因为查询结果(@tesdal提到的投影查询除外)是通过键访问的;但是您得到的排序错误,因为排序取自索引。

App Engine 不保证索引更新时间。

在您的示例中,这意味着索引数据为 10,7,7,7,1,但返回的结果是实际对象(已更新),因此您注意到排序已关闭,因为您希望其中一个条目为 8。

如果使用投影查询,则会看到 10,7,7,7,7,1。

最新更新