【问题标题】:Are single-entity datastore writes atomic?单实体数据存储写入是原子的吗?
【发布时间】:2013-05-21 04:17:47
【问题描述】:

在 AppEngine DataStore 中,给定实体 a = MyModel(a=1, b=2)a.put() 是原子的吗?也就是说,如果我运行:

a.a=3
a.b=4
a.put()

我是否保证实体的所有属性都已正确更新(假设a.put() 没有引发异常)?

Dan Sanderson 的bookit is,但我在其他地方找不到关于该主题的具体文档。

【问题讨论】:

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


    【解决方案1】:

    是的,单个实体的更新是原子的。

    in this article 所述,给定实体是 Bigtable 行中的单个协议缓冲区。协议缓冲区始终以原子方式写入。

    【讨论】:

    • 能否请您指出一些这样的文档?
    • 我想我已经找到了一些结论性的陈述。我最初的回复只是基于我作为在 Google 工作的人的知识,因此了解 Datastore 背后的系统。
    • 大家都同意原子数据的定义吗,你是说数据作为离散记录存在?
    • @peterretief 你熟悉协议缓冲区吗?
    • @Amber 直到大约 5 秒前,有趣
    【解决方案2】:

    是与否。

    它是原子的,但它是最终一致的。如果没有正确考虑,它可能会对业务逻辑产生巨大影响。

    例如如果你这样做了:

    a = A(id=1)
    a.b = 2
    a.c = 3
    a.put()
    .... wait some time
    a = A(id=1)
    a.b = 4
    a.c = 5
    a.put()
    ....
    # check now
    

    如果您查询 a = db.get_by_key(1),它将始终具有 a.b==2 和 a.c==3。

    但是如果你通过索引查询实体,它会给出不同的结果。

    比如同时查询

    A.query(A.b==4)
    A.query(A.c==5)
    

    然后其中一个(任何)查询可以返回 1 条记录,而其他查询则不返回任何内容。或者两者都返回 1 条记录。或者两者都没有返回一段时间。最终它将始终为每个查询返回稳定的 1 条记录。但时间无法保证 - 通常需要几毫秒,但如果出现大问题,可能需要几秒钟甚至几分钟或几小时。

    您可能有兴趣阅读更多相关信息: https://cloud.google.com/datastore/docs/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore/

    【讨论】:

    • 这完全不合逻辑。这个问题没有问任何关于一致性的问题,甚至根本没有读回数据。
    • 我明白你的意思,严格来说是的,你是对的。我只是相信没有足够的上下文来确定它到底被问到了什么,因为它应该是原子的这一事实从只有一个 .put() 调用这一事实非常明显。这不像您更新 1 个属性,然后是另一个没有任何 put 的属性(假设它以某种方式自动调用,与 ndb 为 get() 自动批处理的方式相同。)并询问这是否是原子的。从理论上讲,一个人可能存在一致性问题。
    猜你喜欢
    • 2018-03-03
    • 2019-02-17
    • 2022-01-23
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多