C# Azure Cosmos DB MongoDB API 4.0事务异常处理 描述

C# Azure Cosmos DB MongoDB API 4.0事务异常处理 描述,c#,mongodb,azure-cosmosdb,mongodb-.net-driver,azure-cosmosdb-mongoapi,C#,Mongodb,Azure Cosmosdb,Mongodb .net Driver,Azure Cosmosdb Mongoapi,我正在开发一个需要处理MongoDB文档更新同步的应用程序。为此,我使用Azure Cosmos DB MongoDB API 4.0,该API支持 问题 有时,在事务内的更新过程中,我会遇到以下异常: MongoDB.Driver.MongoCommandException: Command update failed: Error=112, Details='Response status code does not indicate success: Conflict (409); Sub

我正在开发一个需要处理MongoDB文档更新同步的应用程序。为此,我使用Azure Cosmos DB MongoDB API 4.0,该API支持

问题 有时,在事务内的更新过程中,我会遇到以下异常:
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的数量(吞吐量)应该可以解决问题。

    谢谢您的回答。最后,我结合了对单个更新的重试策略和事务处理策略。