日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MongoDB中的读写锁

發布時間:2025/6/17 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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中的读写锁的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。