为何Cosmos DB存储过程实现原子插入替换仍出现重复实体?
Cosmos DB存储过程并发出现重复条目的原因
1. 事务范围未匹配逻辑分区
Cosmos DB的存储过程事务仅在单一逻辑分区内保证原子性。如果你的容器分区键不是type字段,多个并发请求会被路由到不同的逻辑分区执行,每个分区的存储过程无法感知其他分区的查询结果,会各自执行创建操作,最终产生重复条目。
2. 未正确处理异步操作的完成信号
你的存储过程里,queryDocuments、createDocument、replaceDocument都是异步操作,但整个存储过程没有调用__.done()标记执行完成。Cosmos DB存储过程会在主函数执行完毕后立即结束,不会等待异步回调完成——这意味着当多个并发进程的存储过程查询到items.length === 0后,主函数已经结束,事务未覆盖后续的createDocument操作,多个创建请求会同时生效,导致重复数据。
同时,回调中的错误抛出无法终止整个存储过程的执行流程,进一步加剧了并发下的不一致性。
3. 未设置唯一键约束兜底
即使依赖存储过程事务,也应该给type字段设置唯一键约束。这是Cosmos DB层面的兜底机制,能直接阻止重复type值的文档插入,避免因存储过程逻辑或事务范围问题导致的重复数据。
内容的提问来源于stack exchange,提问作者stanleyerror
相关产品推荐
相关产品推荐

