Azure Cosmos DB MongoDB API 20个并行只读事务触发Transaction not active错误
问题根因
- 你遇到的报错本质是触发了Azure Cosmos DB MongoDB API的单物理分区并行活跃事务上限,该阈值默认固定为20,这也是你20个并行请求100%复现、19个请求正常的直接原因。
- 哪怕是只读事务,在Cosmos DB的实现逻辑中也会占用分区的事务会话槽位、分配快照资源,会计入活跃事务配额统计,不会因为事务标记为
readOnly就豁免。 - 报错的直接表现是:第20个并行事务发起时,服务端直接拒绝事务初始化,但客户端没有捕获到该异常,后续Spring Data MongoDB的
MongoTransactionManager按正常流程提交事务时,就会抛出Transaction is not active的错误。
解决方案
1. 分区流量拆分
调整集合的分片键策略,让你的事务请求分散到不同的物理分区上,每个物理分区独立享有20个并行活跃事务的配额,可直接提升整体事务并发承载能力。
2. 配置针对性重试逻辑
对返回的BadRequest(400)+Substatus: 1101错误,添加指数退避重试逻辑:
- 可通过Spring的重试注解
@Retryable,指定针对该异常场景做最多3~5次的退避重试 - 注意不要设置过高的重试次数,避免触发服务端的流控限制
3. 非必要场景规避事务使用
如果你的场景仅需要单次读的结果一致性,不需要在同一个事务内执行多次读操作,可以直接关闭事务,将读请求的一致性级别调整为会话一致性,即可获得和只读事务一致的快照读效果,同时不会占用事务配额。
4. 申请配额提升
如果以上优化都无法满足你的业务并发需求,可以联系Azure客户支持,申请提升对应Cosmos DB账户的单分区并行活跃事务上限。
内容的提问来源于stack exchange,提问作者der.Schtefan
相关产品推荐
相关产品推荐

