在Azure DocumentDB中,以原子方式递增文档中的整数

在Azure DocumentDB中,以原子方式递增文档中的整数,azure,azure-cosmosdb,Azure,Azure Cosmosdb,如何在Azure DocumentDB中以原子方式递增文档中的整数 在存在并发写入程序的情况下,增量操作必须是原子的。不允许丢失增量(在简单的读-修改-写算法中可能会丢失增量)。来自: DocumentDB如何提供并发性 DocumentDB通过HTTP支持乐观并发控制(OCC) 实体标记或ETag。每个DocumentDB资源都有一个ETag,并且 DocumentDB客户端将其最新的读版本写入 请求。如果ETag是当前的,则提交更改。如果 值已在外部更改,服务器将使用 “HTTP 412前置

如何在Azure DocumentDB中以原子方式递增文档中的整数

在存在并发写入程序的情况下,增量操作必须是原子的。不允许丢失增量(在简单的读-修改-写算法中可能会丢失增量)。

来自:

DocumentDB如何提供并发性

DocumentDB通过HTTP支持乐观并发控制(OCC) 实体标记或ETag。每个DocumentDB资源都有一个ETag,并且 DocumentDB客户端将其最新的读版本写入 请求。如果ETag是当前的,则提交更改。如果 值已在外部更改,服务器将使用 “HTTP 412前置条件失败”响应代码。客户必须阅读 请获取资源的最新版本,然后重试该请求

可以使用此属性来实现:

还要注意,Azure DocumentDB中的事务在数据的快照上运行(快照隔离)


顺便说一句:如果您想做一些自动化程度更高的事情(当有人修改文档时自动递增),您可以使用触发器和分隔的集合作为整数的当前值。触发器在同一事务中执行,因此它将是一致的和自动的。

您所说的“它们在简单的读-修改-写算法中可能”是什么意思?每个文档都有一个Etag,使用非当前Etag发送的任何更改都将被拒绝(HTTP 412),谢谢。这就是答案。如果你不想添加它,我稍后会自己添加。
 while (true) {
  var existingDoc = ReadDoc();

  existingDoc.Int++;

  try {
   WriteDoc(existingDoc);
   break;
  }
  catch { //Concurrency violation
   continue;
  }
 }