我正在使用Ruby的delayed_job_mongoid gem在后台排队一些map / reduce作业。工作进展顺利,大约一分钟就完成了。
现在我正在尝试在处理作业时查询作业的状态,但是我发现在map / reduce运行时我在delayed_jobs表上执行的任何查询都会挂起,阻塞直到所有工作已经完成。
因此,例如,如果我在map / reduce运行时执行db.delayed_jobs.find(),它只是坐在那里直到每个最后一个作业完成,然后它最终显示表的内容(它是空的点)。这几乎就像整个表在作业运行时被锁定一样。这不是我所期望的。
我已经检查过,我没有用完数据库连接。有谁知道发生了什么事?
答案 0 :(得分:0)
这实际上限制了MongoDB的地图减少目前的工作方式。目前,MongoDB仍然具有数据库级别锁定和映射减少作业,特别是取出读取和写入锁定,除非作业明确是非原子的。
您可以阅读有关如何使mapReduce命令非原子here的更多信息(警告:这仅适用于MongoDB v2.2 +)。
如果 nonAtomic 为true,则后处理步骤将阻止MongoDB锁定数据库;但是,其他客户端将能够读取输出集合的中间状态。否则,map reduce操作必须在后处理期间锁定数据库。
MongoDB的aggregation framework通常比map reduce更高效。然而,它是相当新的,它还不能完全做同样的事情。如果您可以通过聚合框架完成相同的任务,我建议您使用它。
供您参考,这里列出了操作类型以及每个操作需要的锁类型:
http://docs.mongodb.org/manual/faq/concurrency/#which-operations-lock-the-database