1

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

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

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

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

4

2 回答 2

4

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

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

于 2013-05-21T04:24:59.410 回答
-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) 它总是有 ab==2 和 ac==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/

于 2015-09-25T09:35:35.527 回答