MS / Azure为CosmosDB stored procedures提供的所有javascript示例强制使用必须由调用客户端处理和控制的continuation mechanisim。这是否会破坏ACID原子交易的目的?
为了获得基于ACID事务的更新集,我编写了这个更加简化的存储过程:
function replace(updates) {
var container = getContext().getCollection();
var containerLink = container.getSelfLink();
if (typeof updates === "string") updates = JSON.parse(updates);
updates.forEach(
function(doc) {
var isAccepted = container.replaceDocument(doc._self, doc,
function (err) {
if (err) throw err;
}
);
if (!isAccepted) throw new Error("Execution bounds exceeded for a replace.");
}
);
}
这似乎迫使我向SP提供的任何东西都是原子的,或者是失败的。但在看到供应商提供的所有示例后,我只想问,这是个好主意吗?现在,我正在做的事情,我真的不希望达到5秒的限制,虽然它可能在某些点我可能最大化RU,所以在这种情况下,只要我在我的后端代码中构建Cosmos客户端为了能够使用它,我会好吗?
顺便说一句 - 描述5秒限制的MS文档在哪里?可以传递给存储过程的数据大小是否有限制? (我通过试验/错误发现SP本身的大小有限制,我相信它大约1MB左右IIRC)
这似乎迫使我向SP提供的任何东西都是原子的,或者是失败的。但在看到供应商提供的所有示例后,我只想问,这是个好主意吗?
在我看来,您目前的计划对于RU来说既耗时又昂贵。您需要传递需要更新的数据,在此之前,您需要准备此类数据(从数据库查询或在您自己的应用程序中组装)。
我建议您使用存储过程的bulk update example。基于该文档,Azure Cosmos DB中的数据库引擎支持完全ACID(原子性,一致性,隔离性,持久性)事务和快照隔离。
描述5秒限制的MS文档在哪里?可以传递给存储过程的数据大小是否有限制?
在official document中没有找到这样的限制声明,但在这个blog中仍然有许多线索。无论如何,SP有time out situation,你不能忽视它。正如您在问题中提到的,如果更新数据很大,则需要管理延续令牌。还可以在blog中找到示例。