1. 数据库会为每个MongoDB数据库连接创建一个队列,存放这个连接的请求,当客户端发送一个请求,会被放到队列的末尾。只有队列的请求都执行完毕,后续的请求才会执行。注意:每个请求都有独立的队列,要是打开两个shell,就有两个数据库连接。在一个shell中执行插入,之后在另一个shell中进行查询不一定能得到插入的文档。然而在同一个shell中,插入后在进行查询一定能查到的。当开发者用一个线程插入数据,用另一个线程检查是否插入成功时,会遇到这样的问题。有那么一两秒的时间,好像根本没有插入数据,但随后又突然冒出来。
2. 使用读写锁(共享-排他锁、多读单写锁),允许对数据库进行并发的读访问,并且对每一个写操作提供排他的访问。当存在一个读锁时,很多读操作均可使用这个锁。当一个写锁出现,一个写操作排他的占有该锁,并且不被其他的读或者写操作共享。锁是偏向于写操作的,即相对于读操作,写操作有更高的优先权。当一个读和写操作同时在等待一个锁时,mongodb优先给写操作分配锁。 在 2.2 版本以前,mongoDB 只有全局锁;在 2.2 版本开始,大部分读写操作只锁一个库,相对之前版本,这个粒度已经下降,例如如果一个 mongod 实例上有 5 个库,如果只对一个库中的一个集合执行写操作,那么在写操作过程中,这个库被锁;而其它 5 个库不影响。相比 RDBMS 来说,这个粒度已经算很大了!
原文:http://www.cnblogs.com/myanchen/p/3623363.html