Mongo DB eval nolock:true



嗨,
我正在从节点 js 运行 eval 脚本,使nolock为 true 以禁用全局锁。我从 java 运行的同一个 eval 脚本也使用 nolock true。

String jsFunction = "function(){"
                          + "var uid = 12;"
                            + "return refreshList(uid,false);}";
DBObject commandObj = new BasicDBObject();
commandObj.put("eval", jsFunction);
commandObj.put("nolock", true);
CommandResult status =db.command(commandObj);
db.eval("function (x, isoverwrite) { return refreshList(x, isoverwrite);}",                                                              [21,isoverwrite] ,{nolock:true}, function(err, result){
    });

在 java 中运行脚本时,db 中没有锁定,我可以同时运行查询。但是在运行上述代码的节点js中,我无法同时执行其他过程。我也无法在 mongodb 控制台中看到锁定日志。我不知道为什么两者的行为都会发生变化。我也尝试在节点js中使用命令查询,但我遇到了同样的问题。

默认情况下,eval 函数本身将获取并持有全局写锁。 通过将nolock设置为 true,您所做的只是防止该锁被 eval 占用。 设置nolock不会影响 JavaScript 代码本身中的操作是否采用写锁定,因此您在代码本身中执行的任何更新、插入、查找和修改等操作仍将像任何其他写入操作一样采用锁定(作为参考,这基本上直接来自文档)。

没有其他选择或解决方法,您无法在不影响锁定的情况下将数据写入数据库,如果您正在写入数据(包括更新),则必须采用写锁定。 在 eval 语句中运行操作服务器端不会改变这一点。

值得注意的是,您发布的警告消息只是一个警告。 这意味着有问题的查询试图产生(通常是因为它对磁盘造成了错误),并且由于当时它持有的锁的性质而无法产生 - 这不是错误。 我建议在 eval 块之外运行它以查看它的外观,并从等式中完全删除 eval。

最新更新