当前位置: 首页 > 知识库问答 >
问题:

Azure Cosmos DB MongoDB API 4.0事务异常处理

籍靖
2023-03-14

我正在开发一个需要处理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. 任何人都可以提供有关列出的异常消息的任何其他信息吗?例如:如何调试、处理和恢复它们?(欢迎提供任何信息。)

共有1个答案

田化
2023-03-14

你对错误的诊断非常准确。Azure Cosmos DB API for MongoDB有列出常见错误和解决方案的文档。

(1) 112当另一事务或写入操作使用同一文档时发生错误。建议的解决方案是重试操作,直到操作成功。

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

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

 类似资料:
  • 我有一个类,它有一个方法,该方法调用另一个服务上的另一个方法。大概是这样的: 我预计一个实体将被插入,但是如果任何嵌套事务抛出异常插入将拒绝,即使这个异常也是在处理的。 我可以用注释。但它会胜过表演。

  • 我在tomcat服务器中使用具有多个数据源配置的JTA原子事务。有时我会遇到以下异常: JTA事务意外回滚(可能是由于超时);嵌套的异常是javax。交易回滚异常:事务被设置为仅回滚 出现这种异常的原因是什么?

  • 出现运行时异常--这应该会导致事务回滚。 我希望能够截获异常,并回复一个真正的消息(而不是异常)给客户机。因此,我开始实现一个错误处理程序: 其中: null null null 如何配置camel,既防止事务中的消息刷新,又能够将异常转换为已处理的错误消息?

  • 我正在使用quarkus版本,需要知道如何处理未知endpoint。当我试图命中尚未实现的endpoint时,它只会发送,而不是我希望实现的异常。我无法找到相同的实现。有人能帮我做这个吗?

  • 我在存储库类中有一个方法,标记为,该方面正在执行,如stacktrace中所示,但抛出的异常是“Transaction required exception” 电磁场: 交易: 我真的要疯了,任何帮助都会很好。 似乎,有一个事务,它被检查为完成,加入事务失败,所以它标记为仅回滚,因为它不能加入它。

  • 这很好,但并不总是在代码中抛出运行时异常。因此,我挖掘并发现如下所示的rollbackFor; 现在,我必须更改所有代码,以使用RollBackfor更改@Transactional。但是还有其他方法可以将所有@transaction advice属性更改为rollbackFor=exception.class吗?