在NDB(Python的Google App Engine数据存储库)中自动使用缓存是否会使事务模型失效?

use*_*609 8 google-app-engine app-engine-ndb google-cloud-datastore google-app-engine-python

Google Cloud Datastore的一个主要卖点是它在实体组中提供了强大的一致性.

Cloud Datastore确保按键和祖先查询的实体查找始终接收强一致性数据.

[数据存储区适用于]基于ACID属性的交易,例如,将资金从一个银行账户转移到另一个银行账户.

NDB库是从谷歌应用程序引擎访问数据存储为Python的记录方式.

但是,默认情况下,NDB库使用缓存来加速结果.使用的缓存是"上下文缓存"和内存缓存.但是这些缓存都不能与数据存储区进行事务更新.因此,似乎必须放弃重要的一致性属性(强调我的):

提交事务时,其上下文将尝试从memcache中删除所有此类实体.但请注意,某些故障可能会阻止这些删除的发生.

我对此的理解是否正确?也就是说,在默认配置中使用NDB库时,即使在实体组内也没有一致性保证?

如果我是对的,这是一个大问题.

它牺牲了数据存储区的最大特性.所有这些关于一致性和ACID事务的文档.在Google IO上谈论如何使用实体组来获得一致性.甚至是研究论文.而且,在文档的一个小角落里,在最随意的句子中,我知道我没有在默认配置中获得这些属性.

这令人难以置信的误导.我相信大多数人都没见过这个.大多数实现可能期望实体组内的ACID事务,但他们没有得到它.这些是生产代码中的严重错误.

这是实施和文档的重大失败.默认情况下永远不应该牺牲速度的一致性.一致性是实体组的重点.如果实现做了这个意想不到的事情,它会如此戏剧性地改变语义,那么文档应该让它变得非常清晰.

Ale*_*nok 2

据我所知,如果您获得具有事务缓存的实体,则不会使用缓存,因此您可以进行数据修改。

按键直接读取数据存储是一致的。因此,如果您想在读取时获得高度一致的结果,则需要在需要时禁用 ndb 缓存。否则,您将获得最终一致性,例如,如果缓存失效成功或缓存过期/被逐出。

您可能还需要在事务完成后手动从缓存中删除实体ndb.delete()_use_datastore=False以确保缓存是干净的。