我想确认我对 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)
在这种情况下,逻辑告诉我应该获得内容的最新值,因为按键读取保证了高度的一致性。我会很感激确认。