MongoDB集合锁定-它是如何工作的?

MongoDB集合锁定-它是如何工作的?,mongodb,locking,Mongodb,Locking,我没有这么大的收藏,有大约500k的记录,但这是至关重要的任务 我想添加一个字段并删除另一个字段。我想知道它会不会在插入/更新时锁定该集合(我真的不希望有任何停机时间) 我做了一个实验,它看起来并没有阻止它: // mongo-console 1 use "my_db" // add new field db.my_col.update( {}, { $set: { foobar : "bizfoo"} }, { multi: true}

我没有这么大的收藏,有大约500k的记录,但这是至关重要的任务

我想添加一个字段并删除另一个字段。我想知道它会不会在插入/更新时锁定该集合(我真的不希望有任何停机时间)

我做了一个实验,它看起来并没有阻止它:

// mongo-console 1
 use "my_db"

// add new field
db.my_col.update(
    {},
    { $set:
      { foobar : "bizfoo"}
    },
    { multi: true}
    );

// mongo-console 2
use "my_db"
db.my_col.insert({_id: 1, foobar: 'Im in'});
db.my_col.findOne({_id: 1});

=>{ "_id" : 1, "foo" : "bar" }
虽然我真的不明白为什么,因为db.currentOp()显示它上面有写锁

在生产系统上,我也有副本集,我很好奇它对迁移有何影响。 有人能回答这些问题吗,或者给我指一篇文章,上面有很好的解释。 谢谢


(我使用的MongoDB版本是2.4)

MongoDB 2.4在每个碎片的数据库级别上锁定。您提到您有一个副本集。副本集对锁定没有影响。碎片可以。如果对数据进行了分片,则在执行更新时,锁将仅锁定数据所在分片上的数据库。如果没有对数据进行分片,则在写入操作期间数据库将被锁定

为了查看影响,您需要进行大量工作的测试

您可以在以下网址阅读更多内容:

数据库设计用于在运行时快速添加/删除字段。只要添加或删除一条记录,就不会破坏使用DB运行的应用程序。添加或删除不应导致任何停机。谢谢Adam。我想这是我所期望的,但在这方面有什么好的论文吗?我有点理解这对于RDBMS来说很容易,但我认为mongodb必须接触集合中的所有文档,而且操作并不那么简单……但我还有一个问题,也许你知道答案。我想知道为什么我能在似乎有写锁的集合上插入?我在这里遗漏了什么吗?正如Adam在上面提到的,操作通常非常快,更新操作需要多长时间?MongoDB确实有锁生成功能,因此,如果更新操作的数据不在内存中,它将向内存中的插入页生成锁。老实说,我不太熟悉这种逻辑,也不太熟悉何时会产生锁以及何时不会产生锁……但是,假设更新操作需要一段时间,那么可能正是这种产生锁的逻辑允许插入发生。