在某些边缘情况下,我的应用程序需要在许多实体上执行事务(在我当前的情况下,在 163 个实体上)。 发生这种情况时,我会得到以下异常:
File ".venv/lib/python3.10/site-packages/google/api_core/grpc_helpers.py", line 67, in error_remapped_callable
raise exceptions.from_grpc_error(exc) from exc
google.api_core.exceptions.InvalidArgument: 400 operating on too many entity groups in a single transaction.
当我使用旧版云数据存储时,这是预期的,因为限制设置为 25 个实体。 但是,我的应用程序在数据存储模式下自动迁移到 Firestore。我检查了使用
gcloud alpha firestore databases describe
命令查看我的数据库类型(参见相关文档)。
根据本文档,在数据存储模式下使用Firestore,事务不再限于25个实体组
我将客户端库升级到最新版本(python google-cloud-datastore==2.20.1)。尽管堆栈跟踪提示错误来自后端。
我在 25 个实体上进行了一笔测试交易,在 26 个实体上进行了一笔测试交易,只有后者失败了,因此限制仍然强制为 25 个。
迁移的旧数据库是否有问题? 我应该使用另一个客户端库吗?
如果尽管在数据存储模式下使用 Firestore,但仍然受到 25 个实体的限制,则可能是因为数据存储的并发模式所致。
使用
gcloud alpha firestore databases describe
命令。如果你看到这一行:concurrencyMode: OPTIMISTIC_WITH_ENTITY_GROUPS
那么你就受到限制了。
如果您的应用程序与其他模式兼容(请参阅有关并发模式的文档),您可以使用以下命令解除限制:
curl --request PATCH \
--header "Authorization: Bearer "$(gcloud auth print-access-token) \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{"concurrencyMode":"CONCURRENCY_MODE"}' \
"https://firestore.googleapis.com/v1/projects/PROJECT_ID/databases/(default)?updateMask=concurrencyMode"
将
CONCURRENCY_MODE
替换为 PESSIMISTIC
或 OPTIMISTIC
,并将 PROJECT_ID
替换为我们的项目标识符。