google-app-engine - Google Datastore 查询和最终一致性

标签 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)

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

最佳答案

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

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

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

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

关于google-app-engine - Google Datastore 查询和最终一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19884076/

相关文章:

ios - 构建一个 iPhone 应用程序,将数据存储在谷歌应用程序引擎(或类似的)云服务器中

google-app-engine - 将字符串数据转换为在 Go AppEngine 上读取的结构 : Inserted on Java AppEngine (Objectify),

java - EntitySubclass 对象化查询

python - 使用投影查询时的 NDB 缓存

c# - 为 .Net Core 选择正确版本的 GCP 数据存储库

google-app-engine - 应用引擎推送任务在测试中总是返回 404

java - 在 Mac 中通过 Eclipse 在 Google 应用程序引擎中创建新的 Web 应用程序项目

google-app-engine - 如何让 Tipfy 应用程序接受自己的身份验证、OpenID 等?

python - GAE/P : Migrating to NDB efficiently

python - 我应该使用 ndb 结构化属性还是单独的模型来限制我的 GAE 查询。基础数据建模问题。