c# - Azure Cosmos DB MongoDB API 4.0 事务异常处理
问题描述
描述
我正在开发一个应用程序,该应用程序需要处理对 MongoDB 文档所做更新的同步。为此,我使用了支持多文档事务的Azure Cosmos DB MongoDB API 4.0 。
问题
有时,我在事务中的更新期间遇到以下异常:MongoDB.Driver.MongoCommandException: Command update failed: Error=112, Details='Response status code does not indicate success: Conflict (409); Substatus: 5403; ActivityId: 88cc0f1f-708b-4c42-9ba7-70e367f16fe3; Reason: ({
"Errors": [
"Conflicting request to resource has been attempted. Retry to avoid conflicts."
]
});.
at MongoDB.Driver.Core.WireProtocol.CommandUsingCommandMessageWireProtocol`1.ProcessResponse(ConnectionId connectionId, CommandMessage responseMessage)
at MongoDB.Driver.Core.WireProtocol.CommandUsingCommandMessageWireProtocol`1.ExecuteAsync(IConnection connection, CancellationToken cancellationToken)
at MongoDB.Driver.Core.Servers.Server.ServerChannel.ExecuteProtocolAsync[TResult](IWireProtocol`1 protocol, ICoreSession session, CancellationToken cancellationToken)
at MongoDB.Driver.Core.Operations.RetryableWriteOperationExecutor.ExecuteAsync[TResult](IRetryableWriteOperation`1 operation, RetryableWriteContext context, CancellationToken cancellationToken)
at MongoDB.Driver.Core.Operations.BulkUnmixedWriteOperationBase`1.ExecuteBatchAsync(RetryableWriteContext context, Batch batch, CancellationToken cancellationToken)
at MongoDB.Driver.Core.Operations.BulkUnmixedWriteOperationBase`1.ExecuteBatchesAsync(RetryableWriteContext context, CancellationToken cancellationToken)
at MongoDB.Driver.Core.Operations.BulkMixedWriteOperation.ExecuteBatchAsync(RetryableWriteContext context, Batch batch, CancellationToken cancellationToken)
at MongoDB.Driver.Core.Operations.BulkMixedWriteOperation.ExecuteAsync(IWriteBinding binding, CancellationToken cancellationToken)
at MongoDB.Driver.OperationExecutor.ExecuteWriteOperationAsync[TResult](IWriteBinding binding, IWriteOperation`1 operation, CancellationToken cancellationToken)
at MongoDB.Driver.MongoCollectionImpl`1.ExecuteWriteOperationAsync[TResult](IClientSessionHandle session, IWriteOperation`1 operation, CancellationToken cancellationToken)
at MongoDB.Driver.MongoCollectionImpl`1.BulkWriteAsync(IClientSessionHandle session, IEnumerable`1 requests, BulkWriteOptions options, CancellationToken cancellationToken)
at MongoDB.Driver.MongoCollectionBase`1.UpdateOneAsync(FilterDefinition`1 filter, UpdateDefinition`1 update, UpdateOptions options, Func`3 bulkWriteAsync)
我尝试多次重试失败的更新操作(延迟 1000 毫秒),但没有任何运气。
每次重试都以相同的异常消息结束。
最后,异常消息变为:
MongoDB.Driver.MongoCommandException: Command update failed: Error=2, Details='Response status code does not indicate success: BadRequest (400); Substatus: 1101; ActivityId: bcb86266-aa9a-4a2d-9841-7f451d6c72ee; Reason: (Message: {"Errors":["Transaction is not active"]}
我相信最后一个例外是不同的,因为事务超时(文档中的超时 = 5 秒)。
问题
- 使用 Azure Cosmos DB MongoDB API 时,如何从多文档事务期间发生的异常中优雅地恢复?
- 任何人都可以提供有关列出的异常消息的任何其他信息吗?例如:如何调试、处理、恢复它们?(任何信息都非常受欢迎)
解决方案
你很擅长诊断错误。适用于 MongoDB 的 Azure Cosmos DB API 具有列出常见错误和解决方案的文档。
(1) 112 错误发生在另一个事务或写操作正在使用同一个文档时。重试操作直到成功是推荐的解决方案。
(2) 如您所述,第二个错误-“事务未激活”表示已超过 5 秒超时。是否可以限制在多文档事务中进行的操作范围?
另一种可能性是,如果由于可用的 RU(吞吐量)数量不足而限制操作(并在服务器端重试),操作花费的时间比预期的要长。检查这一点的一个好方法是查看标准化 RU 消耗是否达到 100% 并且启用了服务器端重试(默认情况下启用)。如果是这种情况,增加 RU(吞吐量)的数量应该可以解决问题。
推荐阅读
- java - Kafka 消费者和生产者在同一个 IntelliJ 项目中
- swift - How can I iterate through a specific JSON item in Swift
- javascript - 计算的 Vue 属性中的无限事件
- authentication - Cassandra 3.0 中的身份验证被破坏
- amazon-web-services - 删除驻留在亚马逊 s3 上的存储桶内的子文件夹中的文件
- c++ - 为什么我的模板链接列表不起作用?
- python - 在 Discord.py 中查看频道的消息历史记录
- geocoding - 使用 HERE 地理编码和搜索 API v7 的街道交叉口坐标
- java - 检查是否选择了 switch case
- javascript - ES6 - 检查一个类是否属于某个类树