我有一个带有UserData集合的Azure Cosmos DB,其中包含多个用户文档 .
文档通过azure函数进行编辑,该函数抓取文档,将json解析为类,根据需要编辑类,并将其设置为用户文档 .
那么如果它正在做另外一个azure函数被称为从Azure Cosmos DB中获取文档并在第一个函数完成之前进行其他更改呢?即使它在文档中完全改变了单独的字段,其他字段也保持不变,Azure没有明显的方法知道要覆盖哪些字段以及要保留哪些字段 .
这种行为的唯一方法是,如果对文档的请求等待,直到请求它的任何函数完成请求它,但我再也不知道Azure如何解决这个问题 .
1 回答
默认情况下,Cosmos DB不会阻止此行为,但您可以通过实现
optimistic concurrency using etag
来控制此行为 .基本上您要做的是每当您发送文档更新请求时,您都会发送文档的etag以及请求 . 如果etag与服务器上文档的etag值匹配,则更新请求将成功,否则将失败(应该使用419状态代码,但文档未提及) . 如果失败,您可以获取最新文档(及其etag),更新它并再次发送更新的文档 .
来自Replace a Document REST API文档(请参阅请求 Headers 部分):