【问题标题】:How do I place a read lock on MongoDB?如何在 MongoDB 上设置读锁?
【发布时间】:2017-04-06 03:22:08
【问题描述】:

我的应用程序需要访问一个 Mongo 数据库,如果有多个进程/线程正在从特定集合中读取数据,就会发生不好的事情。

我需要限制一组进程从集合(或数据库,如果需要)读取的能力。因此,例如,如果有多个进程试图从数据库中读取,它们会顺序读取,而不是并行。

【问题讨论】:

  • 如果多个进程从集合中读取会发生坏事吗?这听起来很不寻常,你能告诉我们更多吗?
  • @VinceBowdren 是的。集合中的文档确定要放置在集合中的下一个文档。集合中不得有重复项。因此,如果两个进程同时从集合中读取,它们可以读取相同的数据,计算相同的下一个文档,然后都写入相同的文档,这对我的算法不利。

标签: mongodb concurrency locking database


【解决方案1】:

这可以在驱动程序级别完成。如果将连接池大小设置为 1,则所有对数据库的访问都将按顺序进行。

在nodejs中你可以将驱动设置为:

MongoClient.connect(url, {  
  poolSize: 1
});

来自文档:

poolSize,这可以让你控制有多少 tcp 连接 并行开放。默认值为 5,但您可以设置它 尽可能高。驱动程序将使用循环策略来 从 tcp 连接分派和读取。

【讨论】:

  • 即使在不同进程中启动多个MongoClient 实例,这是否有效?例如,如果两个进程都运行MongoClient.connect(url, {poolSize: 1});,数据库是否仍会依次接受来自这两个进程的连接? @kozakvoj
  • 不,但如果您真的需要顺序访问您的数据库(这是@VinceBowdren 提到的不寻常情况),您可以使用消息队列。您的线程可以将数据库读取委托给队列,队列将在完成时通知它们(异步)。
猜你喜欢
  • 1970-01-01
  • 2014-12-25
  • 2021-05-29
  • 1970-01-01
  • 2015-05-29
  • 1970-01-01
  • 2015-08-28
  • 1970-01-01
  • 2018-03-19
相关资源
最近更新 更多