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