如何通过广义方式在Cosmos DB存储过程中处理乐观并发?

时间:2018-07-24 12:41:11

标签: azure azure-cosmosdb

我有一个存储过程,可以简单地基于Etag更新文档。

我已经获取了3种文档,更新了所有3种文档的某些属性。我正在尝试更新存储过程中的所有3个文档。但是在存储过程更新第3个文档之前,另一个用户更新了第3个文档。所以在这种情况下,我确实会出现并发错误。我可以在存储过程中获取文档,但是我不确定必须更新哪个属性,因为我不知道该属性是由我还是由存储过程中的其他用户修改的,因为它只是替换了文档。在文档需要更新的所有地方都使用了相同的存储过程,因此我无法对其进行硬编码。

我该如何处理?

在实体框架代码优先方法中,我们确实为SQL提供了一个 DbUpdateConcurrencyException 类,从中我们可以看到哪个属性被修改并采取相应的操作。 Cosmos DB中是否提供类似于DbUpdateConcurrencyException的异常类?

我确实已经阅读了DocumentDB revisited Part 3 – Concurrency in DocumentDBDocumentDB – Optimistic Concurrency in a Stored Procedure这两篇文章。它们告诉我们如何使用Etag处理乐观并发。

1 个答案:

答案 0 :(得分:1)

如果您的存储过程仅将新文档存储起来,则无法确定哪些属性已更改。

如果您的存储过程同时使用了现有文档(例如,ETag所针对的版本)和要存储的新文档,则可以进行比较以确定哪些属性已更新。如果ETag检查失败,请使用内存中的差异重新获取最新文档并根据需要更新属性。