【问题标题】:Google Datastore queries and eventual consistencyGoogle Datastore 查询和最终一致性
【发布时间】:2023-03-10 20:07:01
【问题描述】:

我想确认我对 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)

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

【问题讨论】:

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


    【解决方案1】:

    场景一。是的,你的理解是正确的。

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

    场景3。是的,你的理解是正确的。

    你也可以通过在同一个事务中做所有事情来避免最终的一致性,但这当然可能不适用。

    【讨论】:

    • 啊哈,谢谢,很有趣。因此,正常进行查询与使用 keys_only=True 进行查询然后从键中读取是有区别的。
    • 是的,检查密钥应该是一致的......但是,我在事务回滚方面遇到了问题......(如果提交语句中出现问题)它并不总是有效(使用 JDO - Java)......我认为我没有做错......但认为使用本机谷歌代码它应该可以工作!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 2016-10-04
    相关资源
    最近更新 更多