2011-08-09 47 views
14

我開始在工作中使用MongoDB至今非常好。 我想知道MongoDB如何處理併發更新? 我讀過MongoDB中沒有鎖定功能,所以我想知道處理這個問題的常見做法是什麼。MongoDB如何處理併發更新?

謝謝。

回答

20

MongoDB使用一個進程寬寫鎖來保證一次只能執行一個寫操作(更新/插入/刪除)。因爲它自動解決併發問題,因爲寫入併發是不允許的。

如果4個線程嘗試更新操作,其中一個線程將採取寫入鎖定,執行更新並釋放鎖定。之後,其餘3個之一將搶鎖,進行更新等。

如果您的操作無法在單個寫入操作中進行封裝,則只會發揮併發功能。請注意,對於最常見的用例(查找文檔,更新它並以原子方式獲取新版本),MongoDB提供了「findAndModify」命令,它可以做到這一點:http://www.mongodb.org/display/DOCS/findAndModify+Command

更新:鎖定更精細。

+0

謝謝,我明白爲什麼它似乎是常識。 – lollancf37

+0

不客氣。這似乎是一個限制功能,但由於寫入速度相對較快,所以實際上很少出現性能問題。密切注意mongostat中的「鎖定%」,查看持續鎖定花費的時間。 –

3

使用modifier operations

$inc $set $unset $push $pushAll $addToSet $pop $pull $pullAll $rename $bit

個個都是原子。

+0

感謝您指出這篇文章,但它似乎並沒有保證您是唯一一個在特定集合上寫作的人嗎? – lollancf37

+2

只要你使用修飾符操作,不管你有多少個併發寫入。 –