MongoDB在執行寫操作時,WiredTiger存儲引擎會在文檔級別進行併發控制。換句話説在同一時間點上,多個寫操作能夠修改同一個集合中的不同文檔;而當多個寫操作修改同一個文檔時,必須以序列化方式執行。這意味着如果當前文檔正在被修改,其他寫操作必須等待該文檔上的寫操作完成之後才能進行修改。對於大部分的文檔讀寫操作,WiredTiger引擎使用的都是樂觀鎖;而在數據庫和集合級別,WiredTiger使用的是意向鎖。當WiredTiger存儲引擎探測到兩個操作之間發生了衝突,將會產生一個寫衝突並將會重新執行操作。在瞭解到了MongoDB的併發控制機制以後,下面通過一個示例來演示如何監控MongoDB鎖的信息。

(1)切換到scott數據庫中。

test@nosql11 1> use scott

(2)通過一個循環向MongoDB的集合中插入100百萬條文檔:

scott@nosql11 3> for(var i=1; i<=1000000;i++){
    db.test4.insert({"_id":i,"action":"write simulations","iteration no:":i});
}

(3)使用mongotop監控MongoDB讀寫操作的統計信息。

mongotop

# 輸出的信息如下:
2022-04-04T15:48:58+08:00
ns    					total		read		write  
scott.test4				114ms		0ms			114ms  
admin.system.version	0ms			0ms			0ms  
config.system.sessions	0ms			0ms			0ms  
config.transactions		0ms			0ms			0ms  
local.system.replset	0ms			0ms			0ms

(4)使用db.serverStatus監控鎖的信息。

scott@nosql11 6> db.serverStatus().locks

# 輸出的信息如下:
......
	"Database" : {
		"acquireCount" : {
			"r" : NumberLong(10),
			"w" : NumberLong(119862),
			"R" : NumberLong(1),
			"W" : NumberLong(1)
		}
	},
	"Collection" : {
		"acquireCount" : {
			"r" : NumberLong(13),
			"w" : NumberLong(119860),
			"W" : NumberLong(2)
		}
	},
......

提示:從鎖的信息可以看出,此時在數據庫級別和集合級別產生了大量的寫鎖信息。