MongoDB:锁机制
--1 MongoDB 使用的锁
MongoDB
使用的是“readers-writer”锁, 可以支持并发但有很大的局限性,当一个读锁存在,许多
读操作可以使用这把锁,然而,
当一个写锁的存在,一个单一的写操作会 exclusively 持有该锁,同时
其它读,写操作不能使用共享这个锁;举个例子,假设一个集合里有 10
个文档,多个 update 操作不能
并发在这个集合上,即使是更新不同的文档。
--2 锁的粒度
在 2.2
版本以前,mongod 只有全局锁;在 2.2 版本开始,大部分读写操作只锁一个库,相对之前版本,
这个粒度已经下降,例如如果一个 mongod 实例上有
5 个库,如果只对一个库中的一个集合执行写操作,那
么在写操作过程中,这个库被锁;而其它 5 个库不影响。相比 RDBMS
来说,这个粒度已经算很大了!
--3
如何查看锁的状态
db.serverStatus()
db.currentOp()
mongotop
mongostat
the
MongoDB Monitoring Service (MMS)
--4
哪些操作会对数据库产生锁?
下表列出了常见数据库操作产生的锁。
Operation | Lock Type |
---|---|
Issue a query | Read lock |
Get more data from a cursor | Read lock |
Insert data | Write lock |
Remove data | Write lock |
Update data | Write lock |
Map-reduce | Read lock and write lock, unless operations are specified as non-atomic. Portions of map-reduce jobs can run concurrently. |
Create an index | Building an index in the foreground, which is the default, locks the database for extended periods of time. |
db.eval() | Write lock. db.eval() blocks all other JavaScript processes. |
eval | Write lock. If used with the nolock lock option, the eval option does not take a write lock and cannot write data to the database. |
aggregate() | Read lock |
--5
哪些数据库管理操作会锁数据库?
某些数据库管理操作会 exclusively 锁住数据库,以下命令需要申请 exclusively
锁,并锁定一段时间
db.collection.ensureIndex(),
reIndex,
compact,
db.repairDatabase(),
db.createCollection(),
when creating a very large (i.e. many gigabytes) capped
collection,
db.collection.validate(),
db.copyDatabase().This operation may
lock all databases
以下命令需要申请 exclusively
锁,但锁定很短时间。
db.collection.dropIndex(),
db.collection.getLastError(),
db.isMaster(),
rs.status()
(i.e. replSetGetStatus,)
db.serverStatus(),
db.auth(),
and
db.addUser().
备注:可见,一些查看命令也会锁库,在比较繁忙的生产库中,也会有影响的。
--6 锁住多个库的操作
以下数据库操作会锁定多个库。
db.copyDatabase() must lock the entire
mongod instance at once.
Journeying, which
is an internal operation, locks all databases for short
intervals.
All databases share a single journal.
User
authentication locks the admin database as well as the
database the user is accessing.
All writes to a replica set’s
primary lock both the database receiving the writes and
the
local database. The lock for the local database allows the mongod
to write to the primary’s oplog.
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。