node.js - 来自多个进程的 Mongodb 查询;如何实现原子性?

标签 node.js mongodb mongoose atomic

我有一个 mongodb 数据库,其中有多个 Node 进程读取和写入文档。我想知道我怎样才能做到这一点,所以一次只有一个进程可以处理一个文档。 (某种锁定)在进程完成更新该条目后释放。

我的应用程序应该执行以下操作:

  • 使用光标逐一浏览每个条目。
  • (锁定条目以便其他进程无法使用它)

  • 从第三方网站获取信息。

  • 计算新信息并更新条目。
  • (解锁文档)

此外,在解锁文档后的几个小时内,其他进程将不需要更新它。

稍后我想设置多个 mongodb 集群,这样我就可以减少数据库的负载。因此该解决方案应该适用于单个和多个数据库服务器。或者至少使用多个 mongo 服务器。

最佳答案

一个不涉及锁的优雅解决方案是:

  • version 属性添加到您的文档。

  • 更新文档时,增加 version 属性。

  • 更新文档时,在查找查询中包含最后读取的版本。如果您的文档已在别处更新,查找查询将不会产生任何结果,您的更新将失败。

  • 如果更新失败,您可以重试该操作。

我过去使用这种模式取得了巨大的成功。

例子

假设您有一个文档 {_id: 123, version: 1}

假设现在您有 3 个 Mongo 客户端同时执行 db.collection.findAndModify({ query: {_id: 123, version: 1}, update: { $inc: 1 }}); .

第一个更新将应用,其余的将失败。为什么?因为现在 version2query 包含 version: 1

关于node.js - 来自多个进程的 Mongodb 查询;如何实现原子性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44191382/

相关文章:

mongodb - 如何将 mongoDB 与endermint 一起使用?

mongodb - 如何使用 mongo 聚合将字符串转换为日期?

javascript - 将 Bson 转换为 Json 对象

node.js - StrongLoop 的 LoopBack.io : How to turn on HTTP access log?

node.js - Mongoose 填充在一个对象中?

mongodb - 从 GoLang 中的 mongodb 获取最后插入的元素

javascript - 使用最初 undefined variable 的属性来实现 useEffect 依赖

javascript - Mongoose,函数无法在未定义上执行,来自查询函数

javascript - Populate() 引用嵌套在对象数组中

javascript - Mongoose 忽略对象的一部分,除非定义为 Schema.Types.Mixed