【问题标题】:Atomically increment an integer in a document in Azure DocumentDB以原子方式递增 Azure DocumentDB 中文档中的整数
【发布时间】:2015-01-04 12:08:24
【问题描述】:

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

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

【问题讨论】:

  • 你所说的“它们可能在一个幼稚的读-修改-写算法中是可能的”是什么意思?每个文档都有一个 Etag,使用非当前 Etag 发送的任何更改都将被拒绝 (HTTP 412) see here
  • 谢谢。那将是答案。如果你不想添加,我稍后会自己添加。

标签: azure azure-cosmosdb


【解决方案1】:

来自documentation

DocumentDB 如何提供并发性?

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

可以使用这个属性来实现CAS loop

 while (true) {
  var existingDoc = ReadDoc();

  existingDoc.Int++;

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

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

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

【讨论】:

    猜你喜欢
    • 2011-03-21
    • 2014-12-06
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多