【问题标题】:Google App Engine: close .put() and .get() race condition?Google App Engine:关闭 .put() 和 .get() 竞争条件?
【发布时间】:2012-06-16 17:35:44
【问题描述】:

我通过 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。

【问题讨论】:

  • 你说的不正确是什么意思。你能举一个小例子,说明每行的投票数/时间戳吗?以某种方式呈现变化无常的类型..
  • @Lipis 添加了一个示例。谢谢!

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    如果您使用 projection query,您将看到 10,7,7,7,1。

    【讨论】:

      猜你喜欢
      • 2012-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-11
      • 2020-07-12
      • 2018-05-22
      • 1970-01-01
      • 2020-09-13
      相关资源
      最近更新 更多