MongoDB的鎖機制 (Concurrency)

chenfeng發表於2016-03-25
--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.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-2063531/,如需轉載,請註明出處,否則將追究法律責任。

相關文章