Google数据存储区查询和最终一致性

时间:2013-11-09 22:47:34

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

我想确认一下我对Google数据存储区中最终一致性的理解。假设我有一个如下定义的实体(使用ndb):

class Record(ndb.Model):
    name = ndb.StringProperty()
    content = ndb.BlobProperty()

我想我理解情景1,但我对情景2和3有疑问,所以一些建议会受到高度赞赏。

场景1:我插入名为“Luca”的新记录和给定内容。然后,我查询数据存储区:

qry = Record.query(name=="Luca")
for r in qry.iter():
    logger.info("I got this content: %r" % r.content)

据我所知,由于最终的一致性,刚刚插入的记录可能不是结果集的一部分。我知道如果需要的话,可以使用祖先查询。

场景2:我读取名为“Luca”的现有记录,更新内容并将其写回。例如,假设我有此记录的关键字“k”:

r = k.get()
r.content = "new content"
r.put()

然后,我运行与场景1中相同的查询。当我得到结果时,假设记录是结果集的一部分(例如,因为索引已经包含名为“Luca”的记录和密钥k )。我是否保证字段内容将具有其新值“新内容”? 换句话说,如果我更新记录,单独保留其键和索引字段,我保证会读取最新值吗?

场景3:我的做法与场景2类似,其中k是名为“Luca”的记录的关键字:

r = k.get()
r.content = "new content"
r.put()

然后我运行查询的修改版本:

qry = Record.query(name=="Luca")
for k in qry.iter(keys_only=True):
    r = k.get()
    logger.info("I got this content: %r" % r.content)

在这种情况下,逻辑告诉我应该获取内容的最新值,因为按键读取可以保证强大的一致性。我很感激确认。

1 个答案:

答案 0 :(得分:9)

场景1.是的,您的理解是正确的。

场景2.不,相同的查询,所以最终仍然是一致的。

场景3.是的,您的理解是正确的。

此外,您可以通过在同一交易中执行所有操作来避免最终的一致性,但当然这可能不适用。