在Azure DocumentDB中,以原子方式递增文档中的整数
如何在Azure DocumentDB中以原子方式递增文档中的整数 在存在并发写入程序的情况下,增量操作必须是原子的。不允许丢失增量(在简单的读-修改-写算法中可能会丢失增量)。来自: DocumentDB如何提供并发性 DocumentDB通过HTTP支持乐观并发控制(OCC) 实体标记或ETag。每个DocumentDB资源都有一个ETag,并且 DocumentDB客户端将其最新的读版本写入 请求。如果ETag是当前的,则提交更改。如果 值已在外部更改,服务器将使用 “HTTP 412前置条件失败”响应代码。客户必须阅读 请获取资源的最新版本,然后重试该请求 可以使用此属性来实现: 还要注意,Azure DocumentDB中的事务在数据的快照上运行(快照隔离)在Azure DocumentDB中,以原子方式递增文档中的整数,azure,azure-cosmosdb,Azure,Azure Cosmosdb,如何在Azure DocumentDB中以原子方式递增文档中的整数 在存在并发写入程序的情况下,增量操作必须是原子的。不允许丢失增量(在简单的读-修改-写算法中可能会丢失增量)。来自: DocumentDB如何提供并发性 DocumentDB通过HTTP支持乐观并发控制(OCC) 实体标记或ETag。每个DocumentDB资源都有一个ETag,并且 DocumentDB客户端将其最新的读版本写入 请求。如果ETag是当前的,则提交更改。如果 值已在外部更改,服务器将使用 “HTTP 412前置
顺便说一句:如果您想做一些自动化程度更高的事情(当有人修改文档时自动递增),您可以使用触发器和分隔的集合作为整数的当前值。触发器在同一事务中执行,因此它将是一致的和自动的。您所说的“它们在简单的读-修改-写算法中可能”是什么意思?每个文档都有一个Etag,使用非当前Etag发送的任何更改都将被拒绝(HTTP 412),谢谢。这就是答案。如果你不想添加它,我稍后会自己添加。
while (true) {
var existingDoc = ReadDoc();
existingDoc.Int++;
try {
WriteDoc(existingDoc);
break;
}
catch { //Concurrency violation
continue;
}
}