首页 > 解决方案 > 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 秒)。

问题

  1. 使用 Azure Cosmos DB MongoDB API 时,如何从多文档事务期间发生的异常中优雅地恢复?
  2. 任何人都可以提供有关列出的异常消息的任何其他信息吗?例如:如何调试、处理、恢复它们?(任何信息都非常受欢迎)

标签: c#mongodbazure-cosmosdbmongodb-.net-driverazure-cosmosdb-mongoapi

解决方案


你很擅长诊断错误。适用于 MongoDB 的 Azure Cosmos DB API 具有列出常见错误和解决方案的文档。

(1) 112 错误发生在另一个事务或写操作正在使用同一个文档时。重试操作直到成功是推荐的解决方案。

(2) 如您所述,第二个错误-“事务未激活”表示已超过 5 秒超时。是否可以限制在多文档事务中进行的操作范围?

另一种可能性是,如果由于可用的 RU(吞吐量)数量不足而限制操作(并在服务器端重试),操作花费的时间比预期的要长。检查这一点的一个好方法是查看标准化 RU 消耗是否达到 100% 并且启用了服务器端重试(默认情况下启用)。如果是这种情况,增加 RU(吞吐量)的数量应该可以解决问题。


推荐阅读