我想确认一下我对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)
在这种情况下,逻辑告诉我应该获取内容的最新值,因为按键读取可以保证强大的一致性。我很感激确认。
答案 0 :(得分:9)
场景1.是的,您的理解是正确的。
场景2.不,相同的查询,所以最终仍然是一致的。
场景3.是的,您的理解是正确的。
此外,您可以通过在同一交易中执行所有操作来避免最终的一致性,但当然这可能不适用。