MongoDB中的读写锁
1. MongoDB 使用的鎖
MongoDB 使用的是“readers-writer”鎖, 可以支持并發(fā)但有很大的局限性
當(dāng)一個讀鎖存在,許多讀操作可以使用這把鎖,然而, 當(dāng)一個寫鎖的存在,一個單一的寫操作會”exclusively“持有該鎖,同一時間其它寫操作不能使用共享這個鎖;
舉個例子,假設(shè)一個集合里有10個文檔,多個update操作不能并發(fā)在這個集合上,即使是更新不同的文檔。
2. 鎖的粒度
在 2.2 版本以前,mongod 只有全局鎖(鎖定一個server);
從2.2 版本開始,大部分讀寫操作只鎖一個庫(database),相對之前版本,這個粒度已經(jīng)下降,例如如果一個 mongod 實例上有 5 個庫,如果只對一個庫中的一個集合執(zhí)行寫操作,那么在寫操作過程中,這個庫被鎖;而其它 5 個庫不影響。相比 RDBMS 來說,這個粒度已經(jīng)算很大了!
更新:MongoDB 3.4版本,寫操作的鎖定粒度在表中數(shù)據(jù)記錄(document)級別,即使操作對象可能是多條數(shù)據(jù),每條數(shù)據(jù)在被寫入時都會被鎖定,防止其他進(jìn)程寫入;但是寫操作是非事務(wù)性的,即寫入多條數(shù)據(jù),即使當(dāng)前寫入操作還沒有完成,前面已經(jīng)寫入的數(shù)據(jù)也可以被其他進(jìn)程修改。除非指定了$isolated,一次寫入操作影響的數(shù)據(jù)無法在本次操作結(jié)束之前被其他進(jìn)程修改。
$isolated也是非事務(wù)性的,即如果寫入過程出錯,已經(jīng)完成的寫入操作不會被rollback;另外,$isolated需要額外的鎖,無法用于sharded方式部署的集群。
3. 如何查看鎖的狀態(tài)
db.serverStatus()
db.currentOp()
mongotop # 類似top命令,每秒刷新
mongostat
the MongoDB Monitoring Service (MMS)
4. 哪些操作會對數(shù)據(jù)庫產(chǎn)生鎖?
下表列出了常見數(shù)據(jù)庫操作產(chǎn)生的鎖。
| 操作 | 鎖定類型 |
| 查詢 | 讀鎖 |
| 通過cursor讀取數(shù)據(jù) | 讀鎖 |
| 插入數(shù)據(jù) | 寫鎖 |
| 刪除數(shù)據(jù) | 寫鎖 |
| 修改數(shù)據(jù) | 寫鎖 |
| Map-reduce | 讀寫鎖均有,除非指定為non-atomic,部分mapreduce任務(wù)可以同時執(zhí)行(猜測是生成的中間表不沖突的情況下) |
| 添加index | 通過前臺API添加index,鎖定數(shù)據(jù)庫一段時間 |
| db.eval() | 寫鎖,同時阻塞其他運行在MongoDB上的JavaScript進(jìn)程 |
| eval | 寫鎖,如果設(shè)定鎖定選項是nolock,則不會有些鎖,而且eval無法向數(shù)據(jù)庫寫入數(shù)據(jù) |
| aggregate() | 讀鎖 |
總結(jié)
以上是生活随笔為你收集整理的MongoDB中的读写锁的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 8.继续分析一破解加密码获取-最最最简单
- 下一篇: React-表单