本文翻譯自 write concern。
注意,本文內容適用於MongoDB Manual 3.0.2及以上版本。mongodb
所謂的寫關注就是當向客戶端報告寫操做的成功執行時,MongoDB提供的保證。經過提供不一樣級別的寫關注來解決應用的具體需求。shell
mongo shell和MongoDB驅動使用acknowledged做爲默認寫關注級別。數據庫
注:讀與寫如何隔離?寫與寫如何隔離?網絡
在將這些修改提交至磁盤以前,MongoDB容許客戶端讀取剛插入或修改的文檔,無論寫關注的級別或日誌(journaling)配置。其結果是,應用能夠觀察到兩類行爲:併發
其餘數據庫系統稱這些 隔離語義(isolation semantics) 爲read uncommitted。對於全部的插入和更新,MongoDB以隔離方式修改每個文檔:客戶端從不會看到中間狀態的文檔。對於多文檔操做來講,MongoDB並未提供多文檔事物或隔離。ide
當以單機方式(standalone)方式部署的mongod從使用journaled寫關注的寫操做中返回時,數據就徹底提交至磁盤了,重啓mongod後它們就可用了。spa
對於副本集,只有在 在副本集的大部分投票節點上寫操做被複制且提交數據至日誌 以後,寫操做纔是持久的。MongoDB會按期(regularly)提交數據至日誌,無論journaled寫關注:使用commitIntervalMs去控制mongod多長時間提交一次數據。翻譯
客戶端能夠設置一個wtimeout值,做爲replica acknowledged寫關注的一部分。若是在指定的時間間隔內寫關注未被知足,當前操做就會返回錯誤,即便寫關注最終成功完成。日誌
在wtimeout間隔過時以前,MongoDB不會回滾或撤消已作出的修改。進程
MongoDB有下面這些概念性的寫關注等級,由弱到強:
(注:下面這些只是邏輯概念上的寫關注級別,並不是配置write concern時恰好有這幾個配置枚舉值可選。實際上寫關注包含兩個方面,分別對應兩個配置項:w和j,須要組合這兩個配置項來實現下面這些寫關注級別。具體請看Write Concern Reference。)
MongoDB不會告知客戶端寫操做已收到。unacknowledged相似於error ignored。然而,驅動程序在可能的時候會試圖接收並處理網絡錯誤。但驅動檢測網絡錯誤的能力有賴於系統的網絡設置。
在Default Write Concern Change勾畫出的發佈(注:此版本已發佈於2012.11)以前,unacknowledged就是默認寫關注。
acknowledged 也叫 receipt acknowledged。mongod會告知客戶端已收到寫操做,而且已將改變應用於數據的內存視圖。acknowledged 寫關注(write concern)容許客戶端捕獲網絡(network)、重複鍵(duplicate key)和其餘錯誤。但acknowledged 寫關注並不會確認寫操做已經被持久化到磁盤系統。
從Default Write Concern Change勾畫出的驅動發佈(注:此版本已發佈於2012.11)開始,MongoDB將默認使用acknowledged寫關注。
MongoDB僅在將數據提交到journal後才告知客戶端。(告知客戶端什麼信息呢?)這種寫關注會確保在關機或電力中斷後MongoDB可以恢復數據。
你必須啓用journaling以使用這種寫關注。
使用這種寫關注,寫操做必須等到下一第二天志提交(journal commit)才能返回。爲了下降操做延遲,MongoDB也增長了它提交數據至日誌(journal)的頻率。參考commitIntervalMs文檔以獲取更多信息。
注意:
若是在副本集中須要journaled寫關注,只須要寫操做在主節點上完成日誌提交就好了,不用考慮replica acknowledged寫關注。(journaled寫關注只是一種邏輯上的寫關注級別,實際並無這個配置項值,組合w和j兩個配置項才能實現用戶指望的寫關注。)
關於寫關注,副本集(relica set)提出了額外的考慮因素。默認寫關注僅要求來自主節點(the primary)的確認(acknowledgement)。
使用這種寫關注,你可以確保寫操做被傳播至副本集中的額外成員,即部分從節點(the secondary)。參考**Write Concern for Replica Sets **文檔以獲取更多信息。
注意:
若是在副本集中須要journaled寫關注,只須要寫操做在主節點上完成日誌提交就好了,不用考慮replica acknowledged寫關注。(journaled寫關注只是一種邏輯上的寫關注級別,實際並無這個配置項值,組合w和j兩個配置項才能實現用戶指望的寫關注。)