如何在 Azure DocumentDB 中以原子方式递增文档中的整数?
在存在并发写入者的情况下,增量操作必须是原子的。不允许丢失增量(它们在幼稚的读-修改-写算法中是可能的)。
如何在 Azure DocumentDB 中以原子方式递增文档中的整数?
在存在并发写入者的情况下,增量操作必须是原子的。不允许丢失增量(它们在幼稚的读-修改-写算法中是可能的)。
从文档中:
DocumentDB 如何提供并发性?
DocumentDB 通过 HTTP 实体标签或 ETag 支持乐观并发控制 (OCC)。每个 DocumentDB 资源都有一个 ETag,DocumentDB 客户端在写入请求中包含其最新的读取版本。如果 ETag 是当前的,则提交更改。如果该值已在外部更改,则服务器使用“HTTP 412 Precondition failure”响应代码拒绝写入。客户端必须读取最新版本的资源并重试请求。
可以使用此属性来实现CAS 循环:
while (true) {
var existingDoc = ReadDoc();
existingDoc.Int++;
try {
WriteDoc(existingDoc);
break;
}
catch { //Concurrency violation
continue;
}
}
另请注意,Azure DocumentDB 中的事务在数据快照上运行(快照隔离)。
顺便说一句:如果您想做一些更自动化的事情(当有人修改文档时自动递增),您可以使用触发器和分隔集合来获取整数的当前值。触发器在同一个事务中执行,因此它是一致的和自动化的。