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