例外:无法临时释放嵌套锁

时间:2013-07-01 21:04:53

标签: php mongodb

我正在尝试在Mongo中运行一些服务器端JS。我想要执行的操作是:

db.dropDatabase();   // removing current database
db.copyDatabase('db_dump', 'db', 'localhost');  // substituting it with a dump

一切都很好。当我将其存储为函数时:

function () {
    db.dropDatabase();
    return db.copyDatabase('db_dump', 'db', 'localhost');
}

并执行它,一切都很好,并返回{"ok" : 1}

但是当我尝试使用php驱动程序执行此操作时:

$db->execute("function(){ db.dropDatabase(); return db.copyDatabase('db_dump', 'db', 'localhost'); }");

我得到了

{
    "retval": {
        "errmsg":"exception: can't temprelease nested lock",
        "code":10298,
        "ok":0
    },
    "ok":1
}

我的第一个问题是,我只需要摆脱锁定,所以我尝试了这个

$db->command(
    array(
        '$eval' => "function() { db.dropDatabase(); return db.copyDatabase('db_dump', 'db', 'localhost');}"
    ),
    array(
        'nolock'=> true
    )
);

此时没有其他人在使用数据库。

任何想法如何摆脱这个错误?

我正在使用Mongo 2.4.4PHP 5.3.13driver 1.2.10 附:在PHP 5.4.16上尝试过,情况相同

1 个答案:

答案 0 :(得分:2)

无法通过eval命令调用此命令(有关此事项的其他讨论,请参阅this thread)。您可以直接使用copydb调用MongoDB::command()命令,而不是使用JS方法。以下脚本将在同一服务器上的两个数据库之间进行复制,因为我省略了fromhost选项:

$m = new MongoClient();
$m->a->drop();
$m->admin->command([
  'copydb' => 1,
  'fromdb' => 'b',
  'todb' => 'a',
]);