Azure Cosmos DB批量存储超100条记录的事务实现方案咨询
解决方案:使用Cosmos DB存储过程实现大批次事务性文档创建
核心原理
Cosmos DB的存储过程运行在容器的分区键范围内,原生支持ACID事务——只要存储过程执行中任何一步失败,所有已执行操作会自动回滚,完全满足你的事务一致性需求。而且存储过程不受单批次100条操作的限制,只要控制好执行时长和资源消耗,就能处理远超100条的文档创建。
具体实现步骤
编写存储过程
创建接收文档数组参数的存储过程,递归遍历数组完成批量创建。示例JavaScript代码:function bulkCreateDocuments(documents) { var collection = getContext().getCollection(); var response = getContext().getResponse(); var count = 0; function createDocument(doc) { var isAccepted = collection.createDocument(collection.getSelfLink(), doc, function(err) { if (err) throw err; count++; count === documents.length ? response.setBody(`${count} documents created successfully.`) : createDocument(documents[count]); }); if (!isAccepted) response.setBody("Document creation rejected by server."); } documents.length === 0 ? response.setBody("No documents to create.") : createDocument(documents[0]); }部署存储过程
通过Azure门户、Azure CLI或对应SDK,将存储过程部署到目标Cosmos DB容器。若容器有分区键,部署时需明确该存储过程作用的分区范围。调用存储过程
使用SDK调用存储过程并传入待创建的文档数组。以.NET SDK为例:var container = cosmosClient.GetContainer("YourDBName", "YourContainerName"); var documents = new List<YourDocumentModel>(); // 填充documents数组,数量可超过100 var response = await container.Scripts.ExecuteStoredProcedureAsync<string>( "bulkCreateDocuments", new PartitionKey("TargetPartitionKeyValue"), // 容器有分区键时必须指定 documents); Console.WriteLine(response.Resource);
注意事项
- 分区限制:存储过程的事务仅覆盖单个分区键范围,若文档跨多个分区,需按分区分组调用存储过程,同一分区内的操作仍保持原子性。
- 执行时长:存储过程默认最长执行时间为5秒,可在Cosmos DB账户设置中调整至10秒。若文档量过大导致超时,需拆分到多次存储过程调用(单调用内仍保持事务性)。
- RU配额:批量创建会消耗大量请求单位(RU),需确保容器RU配额充足,避免因RU耗尽导致操作失败。
内容的提问来源于stack exchange,提问作者Loren
相关产品推荐
相关产品推荐

