Node.js 和 MongoDB - 多个异步数据库操作的原子性
Node.js and MongoDB - Atomicity of multiple asynchronous DB operations?
在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更新运算符可以实现。
相关文章:
- Node.js设计:多个异步函数使用作为闭包传递的函数写入数据库
- Node.js 和 MongoDB - 多个异步数据库操作的原子性
- 异步索引数据库
- 将数据从异步请求添加到 WebSQL 数据库时出错
- NodeJS:如何使用异步.js来处理数据库中的项目列表
- Javascript:有没有更好的方法在x次异步数据库/ ajax调用后执行函数
- 连接到数据库的单元测试异步函数
- 如何在从数据库异步加载时用占位符替换不存在的图像
- 有没有一种干净的方法来混合异步和同步数据库查询处理
- AngularJS异步调用多个数据库,并且保存顺序不正确
- 同步与异步数据库访问
- javascript数据库操作的对象方法中的异步回调
- 节点代理和异步数据库调用
- 为什么我不需要在Sails.js控制器函数中调用next,即使它在其主体中有一个(异步的?)数据库查询
- 在Node.js中对sqlite数据库进行异步http请求
- 如何使用异步数据库
- Nodejs异步数据库功能需要同步应答
- 数据库集群-异步任务
- 在nodejs中处理异步数据库
- 检查从索引数据库异步检索的几个值