带有文档的Azure CosmosDB如何避免同时编辑单个文档?

时间:2018-03-20 05:21:57

标签: azure azure-cosmosdb

我有一个带有UserData集合的Azure Cosmos DB,其中包含多个用户文档。

通过azure函数编辑文档,该函数抓取文档,将json解析为类,根据需要编辑类,并将其设置为用户文档。

那么如果它正在做另外一个azure函数被称为从Azure Cosmos DB中获取文档并在第一个函数完成之前进行其他更改呢?即使它在文档中完全改变了单独的字段,其他字段也保持不变,Azure没有明显的方法知道要覆盖哪些字段以及要保留哪些字段。

这种行为的唯一方法是,如果对文档的请求等待,直到请求它的任何函数完成请求它,但我再也不知道Azure如何解决这个问题。

1 个答案:

答案 0 :(得分:3)

默认情况下,Cosmos DB不会阻止此行为,但您可以通过实施optimistic concurrency using etag来控制此行为。

基本上,您要做的是每当您发送文档更新请求时,都会将文档的etag与请求一起发送。如果etag与服务器上文档的etag值匹配,则更新请求将成功,否则将失败(应该使用419状态代码,但文档未提及)。如果失败,您可以获取最新文档(及其etag),更新它并再次发送更新的文档。

来自Replace a Document REST API文档(请参阅请求标题部分):

  

如果匹配

     

String用于使操作成为乐观并发的条件。   即只有在指定的etag与之匹配时才更新文档   数据库中的当前版本。该值应设置为etag   资源的价值。