单实体数据存储区是否写入原子?

时间:2013-05-21 04:17:48

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

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

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

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

丹·桑德森的bookit is,但我在其他地方找不到关于这个问题的具体文件。

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:-2)

是&无

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

E.g。如果你这样做:

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

如果查询= 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/