最终一致性是否适用于查询结果集?或者返回的实体本身?

时间:2011-12-06 09:33:18

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

我在Appengine上使用HRD。

假设我有一个跨越实体组的查询(即不是祖先查询)。我知道此查询返回的结果集可能不一致:

例如,即使第5个实体E与查询匹配,查询也可以返回4个实体{A,B,C,D}。这是有道理的。

然而,在上面的不一致查询中,是否也是集合中的任何结果本身可能不一致(即它们的字段不是最新鲜的)的情况?也就是说,如果A有一个名为foo的属性,那么foo是否一致?

我的问题归结为,查询的哪一部分不一致 - 结果集,返回结果的属性,或两者兼而有之?

2 个答案:

答案 0 :(得分:3)

最终一致性适用于实体本身和索引。这意味着如果您修改实体,然后使用仅匹配修改后的实例(不是修改前的值)的过滤器进行查询,则无法获得任何记录。这也意味着您可能会从当前版本与其获取的索引条件不匹配的查询中获取实体。

你可以通过做一致的get来确保你拥有一个实体的最新副本(虽然在事务之外,这是毫无意义的,因为它可能在你获取的那一刻就改变了),但是没有相同的方法可以做一致的索引查找。

答案 1 :(得分:0)

我认为答案是结果集和返回结果的属性都会出现不一致。因为您在查询副本(或Google文档中的数据中心)时会发生不完整性,而这些副本还不知道您之前所写的某些内容。写入可以是任何东西,创建新实体或更新现有实体。

因此,如果你有一个具有属性x的实体A而你:

  1. 将A上的x更新为50(之前为40)
  2. 查询x> = 30
  3. 的实体

    然后你肯定会在resut集中获得这个实体,但它可以有一个旧值x(40),以防你查询的副本还不知道你的更新。