MongoDB的鎖機制 (Concurrency)
--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.
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql的鎖機制MySql
- TiKV 的 MVCC(Multi-Version Concurrency Control)機制MVC
- MongoDB 複製機制MongoDB
- mysql myisam的鎖機制MySql
- oracle中的鎖機制Oracle
- PHP 鎖機制PHP
- SQLite鎖機制SQLite
- Mysql鎖機制MySql
- Oracle鎖機制Oracle
- java鎖機制Java
- oracle 鎖機制Oracle
- SQL鎖機制SQL
- Mysql中的鎖機制——MyISAM表鎖MySql
- Concurrency(十五: Java中的讀寫鎖)Java
- 鎖機制到加鎖的必要性
- MySQL InnoDB 中的鎖機制MySql
- 【MySQL】MySQL中的鎖機制MySql
- Mysql鎖機制分析MySql
- Enqueue 鎖定機制ENQ
- MS SQL鎖機制SQL
- oracle鎖機制研究Oracle
- 分散式鎖機制分散式
- [鎖機制] 鎖相關查詢
- MySql(三) MySql中的鎖機制MySql
- mysql -- 基本的鎖機制導引MySql
- synchronized鎖機制 之 程式碼塊鎖synchronized
- 資料庫鎖機制資料庫
- Mysql各種鎖機制MySql
- mysql鎖機制總結MySql
- ORACLE鎖機制-轉載Oracle
- MySQL鎖機制與MVCCMySqlMVC
- ORACLE DML鎖定機制Oracle
- 鎖機制優化MySQL優化MySql
- MaxDB有關鎖機制
- sqlserver鎖機制(轉載)SQLServer
- 再談mysql鎖機制及原理—鎖的詮釋MySql
- InnoDB儲存引擎鎖機制(二、 鎖的型別)儲存引擎型別
- MySQL效能優化(九)-- 鎖機制之行鎖MySql優化