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

Sat*_*ngh 6 azure azure-cosmosdb

我有存储过程,该过程仅基于Etag更新文档。

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

我该如何处理?

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

我确实读过DocumentDB的第3部分– DocumentDB中的并发DocumentDB –存储过程中的乐观并发,这两篇文章都告诉我们如何使用Etag处理乐观并发。

小智 1

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

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