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

时间:2014-11-07 16:25:48

标签: azure azure-cosmosdb

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

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

1 个答案:

答案 0 :(得分:5)

来自documentation

  

DocumentDB如何提供并发性?

     

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

可以使用此属性来实现CAS loop

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

  existingDoc.Int++;

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

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

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