首页 文章

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

提问于
浏览
0

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

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

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

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

1 回答

  • 3

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

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

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

    If-Match String用于使操作成为乐观并发的条件 . 即,仅当指定的etag与数据库中的当前版本匹配时才更新文档 . 该值应设置为资源的etag值 .

相关问题