如果您需要ACID事务,那么CosmosDB存储过程中强制延续的重点是什么

问题描述 投票:1回答:1

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)

azure-cosmosdb
1个回答
1
投票

这似乎迫使我向SP提供的任何东西都是原子的,或者是失败的。但在看到供应商提供的所有示例后,我只想问,这是个好主意吗?

在我看来,您目前的计划对于RU来说既耗时又昂贵。您需要传递需要更新的数据,在此之前,您需要准备此类数据(从数据库查询或在您自己的应用程序中组装)。

我建议您使用存储过程的bulk update example。基于该文档,Azure Cosmos DB中的数据库引擎支持完全ACID(原子性,一致性,隔离性,持久性)事务和快照隔离。

enter image description here

描述5秒限制的MS文档在哪里?可以传递给存储过程的数据大小是否有限制?

official document中没有找到这样的限制声明,但在这个blog中仍然有许多线索。无论如何,SP有time out situation,你不能忽视它。正如您在问题中提到的,如果更新数据很大,则需要管理延续令牌。还可以在blog中找到示例。

© www.soinside.com 2019 - 2024. All rights reserved.