Node.js 和 MongoDB - 多个异步数据库操作的原子性

Node.js and MongoDB - Atomicity of multiple asynchronous DB operations?

本文关键字:数据库 异步 操作 原子性 js MongoDB Node      更新时间:2023-09-26

在node.js中,假设你有一系列对MongoDB的异步调用,例如:

collection.find(query, projection).toArray(function(err, result) {
    var document = result[0];
    // Do something based off of fields in document...
    collection.update(...)(function(err, result) {
        // Do something...
    }); 
});

整个块会以原子方式发生吗?或者,当快速连续地对此方法进行多次调用时,是否可以交错?

我的想法是:由于 find 是一个异步操作,它发生在某个后台线程上。因此,对此方法的第二次调用可能会运行相同的 find 命令,并在第一次调用有机会更新文档之前获得完全相同的结果。然后,第二个调用具有对文档的过时引用。

这是对的还是我想错了?

不,这不是一个原子代码块。快速多次调用代码可能会在更新之前多次调用find,因此不会运行预期的更新。如果您使用各种更新运算符而不是读取值,在代码中更新它们,然后将值写回,MongoDB 具有原子更新。

inc是最容易用作示例的。您可以编写代码来读取数字,递增数字,然后写回更新的值。但是,如果并发调用该代码,它可以读取该值两次,两次调用都将数字递增到相同的值,其中一个写入"获胜" - 将值递增一次而不是两次。但是,使用 inc 原子处理这种情况(仔细考虑您的写入问题)。

为了更具体地回答您的问题,"根据文档中的字段执行某些操作..."需要使用MongoDB更新运算符可以实现。