Cloud Firestore in Datastore 模式记录了三个并发模式选项:OPTIMISTIC、OPTIMISTIC_WITH_ENTITY_GROUPS 和 PESSIMISTIC。 https://cloud.google.com/datastore/docs/concepts/transactions#concurrency_modes
OPTIMISTIC好像是推荐的模式,但是当我的Legacy Datastore在Datastore自动升级到Cloud Firestore时,自动设置为OPTIMISTIC_WITH_ENTITY_GROUPS。我有时会收到以下错误:
google.api_core.exceptions.Aborted: 409 too much contention on these datastore entities. please try again.
我正在考虑切换到 OPTIMISTIC,但我不知道它是否会破坏任何东西。为什么需要使用 OPTIMISTIC_WITH_ENTITY_GROUPS?似乎 Datastore 在任何模式下都支持祖先和实体组(我不认为我正在使用该功能)。它是否仅适用于第一代 App Engine(例如 Python 2 运行时)?我已经切换到第二代 Python 3.
谢谢。
你想留下来的原因真的只有三个
OPTIMISTIC_WITH_ENTITY_GROUPS
:
您需要写入在整个实体组中是原子的。考虑这个例子:
Foo/1/Bar/1
,第二个并发事务访问Foo/1/Bar/2
。这两项交易都涉及同一实体组中的不同实体Foo/1
.OPTIMISTIC
并发。OPTIMISTIC_WITH_ENTITY_GROUPS
.OPTIMISTIC_WITH_ENTITY_GROUPS
的最可能原因是,你的一些交易在这种情况下失败了,迁移自动化无法判断你是否依赖于这种失败。换句话说,在不了解您的代码的情况下,无法判断“争用失败”对您来说是错误还是功能。所以安全的选择是不改变行为。如果您使用实体组时间戳,您还需要
OPTIMISTIC_WITH_ENTITY_GROUPS
- https://cloud.google.com/appengine/docs/legacy/standard/python/datastore/metadataqueries#entity_group_metadata
OPTIMISTIC_WITH_ENTITY_GROUPS
的另一个原因。您需要
OPTIMISTIC_WITH_ENTITY_GROUPS
的最后一个原因是您正在通过远程API使用数据存储-https://cloud.google.com/appengine/docs/legacy/standard/python/tools/remoteapi
OPTIMISTIC_WITH_ENTITY_GROUPS
,目前没有解决这个问题的计划。OPTIMISTIC
但这会非常危险,建议您找到 Remote API 的替代方案。除了这三个原因,你总是对
OPTIMISTIC
更好。以下是有关如何进行切换的更多信息:https://cloud.google.com/datastore/docs/upgrade-to-firestore#transactions