2015-02-06 20 views
1

正如我看到我們可以設置關注應用程序,我想知道MongoDB將如何處理這樣的情況:MongoDB中的關注點如何在線程級別工作?

可以說我們有兩個任務/進程(P1和P2)運行在同一個數據庫(數據庫具有三個節點的副本集,1個主節點和2個次節點)。 P1在期刊級別啓用了寫作關注。 P2在複製級別啓用了寫入關注(二級)。

現在如果P1和P2都寫入數據庫會發生什麼?

P2會等待P1寫入的數據被複制到輔助寄存器,然後將其數據寫入輔助寄存器?

或它如何處理它?

回答

2

寫操作是關於每個操作,並確定MongoDB何時向客戶端報告寫入成功。它與同時發生的其他操作無關。

如果P1在日誌級別啓用了「寫關注」,我認爲這是寫日記的問題{ "j" : 1 },但是MongoDB不會報告P1發送的操作成功後纔會提交到日誌。 P2寫入的狀態無關緊要。

如果P2具有「在副本級別啓用寫入關注」,我認爲這意味着多數寫入關注{ "w" : "majority" },則每個操作P2都不會被報告爲成功,直到其被複制到副本集合中的大多數節點。 P1寫入的狀態無關緊要。

P1和P2操作不會等待對方的寫入問題在繼續執行之前得到滿足,或類似的問題。

是,第二個寫必須等待一個數據庫寫鎖第一次寫入發佈(可能在中間:由於響應長

編輯迴應評論到答案如果第一次寫入產生鎖,則首先寫入多文檔),但第二次寫入不必等待第一次寫入才能完成整個寫入操作。

作爲示例,考慮寫A{ "w" : "majority" }和寫B{ "w" : 1 }A首先到達主服務器並採取寫入鎖定。 B秒到,等待寫入鎖定。 A使用寫入鎖完成並釋放它; B取鎖。需要將A的寫入複製到輔助節點以滿足其寫入問題 - 這與B持有寫入鎖定同時發生。 B完成,MongoDB響應寫入成功的客戶端。 A完成複製到所需數量的副本集成員,並且MongoDB響應寫入成功。在B之前發送了A,並在B之前的主要日誌上發送了,在此期間它保持鎖定並阻止B,但B首先返回。這不是A的寫入問題,它支持B,更簡單的事實是,MongoDB不能同時對同一個數據庫執行兩次寫入操作。

+0

據我所知,直到mongoDB 2.6,無論何時對集合執行寫操作,數據庫都被鎖定。那麼這不會讓第二個進程等待嗎? (如果他們都寫入同一個數據庫)? 同樣,P1寫入的數據同步是否會延遲數據寫入P2? – Kaushal 2015-02-09 05:58:22

+0

回覆編輯回答。 – wdberkeley 2015-02-09 15:56:10