【发布时间】: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() 没有引发异常)?
【问题讨论】:
标签: 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() 没有引发异常)?
【问题讨论】:
标签: google-app-engine google-cloud-datastore
是的,单个实体的更新是原子的。
如 in this article 所述,给定实体是 Bigtable 行中的单个协议缓冲区。协议缓冲区始终以原子方式写入。
【讨论】:
是与否。
它是原子的,但它是最终一致的。如果没有正确考虑,它可能会对业务逻辑产生巨大影响。
例如如果你这样做了:
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/
【讨论】: