但是上面的解決方案寫得很含糊,僅僅是提到了:應答式寫入.
那麼應答式寫入的具體mongodb sql例子是啥?
下面內容來自[1]
w : 該選項要求確認操作已經傳播到指定數量的mongod例項或指定標籤的mongod例項
w可選的的值
w:1(應答式寫入)
要求確認操作已經傳播到指定的單個mongod例項或副本集主例項(預設為1)
w:0(非應答式寫入)
不返回任何響應,所以無法知道寫入是否成功
但是對於嘗試向已關閉的套接字寫入或者網路故障會返回異常資訊
w:>1(用於副本集環境)
該值用於設定寫入節點的數目,包括主節點
"majority"(大多數)
適用於集群架構,要求寫入操作已經傳遞到絕大多數投票節點以及主節點後進行應答
要求寫入操作已經傳遞到指定tag標記副本集中的成員後進行應答
j : 該選項要求確認寫操作已經寫入journal日誌之後應答客戶端(需要開啟journal功能)
則在意外重啟,宕機等情形下可以通過journal來進行資料恢復
寫入journal操作必須等待直到下次提交日誌時完成寫入
為降低延遲,mongodb可以通過增加commit journal的頻率來加快journal寫入
wtimeout:
該選項指定乙個時間限制,以防止寫操作無限制被阻塞導致無法應答給客戶端
wtimeout的單位為ms,當w值大於1時生效,該引數即僅適用於集群環境
當某個節點寫入時超出指定wtimeout之後,mongod將返回乙個錯誤
在捕獲到超時之前,mongod並不會撤銷其他節點已成功完成的寫入
wtimeout值為0時等同於沒有配置wtimeout選項,容易導致由於某個節點掛起而無法應答
對於單例項應答的情形,是將資料寫入到記憶體後開始應答,除非j:true,則保證掉電後不會丟失資料
1、非應答式寫入圖示
mongodb不對客戶端進行應答,驅動會檢查套接字,網路錯誤等。
mongos> db.version()
3.2.9
mongos> db.version()
3.2.9
mongos> db
test
mongos> db.blogs.insert(,})
writeresult() //此處應答為空
mongos> db.blogs.find({},)
2、應答式寫入圖示
應答式寫入是預設值
mongodb會在收到寫入操作並且確認該操作在記憶體中應用後進行應答,但不會確認資料是否已寫入磁碟
同時允許客戶端捕捉網路、重複key等等錯誤
mongos> db.blogs.insert(,})
writeresult() //此處應答資訊顯示為1個文件已插入
mongos> db.blogs.find({},)
所以應答式還是非應答式取決於writeconcern中的w的取值
reference:
[2]mongodb 寫安全(write concern)
MongoDB 之 幽靈操作避免
進行靜態載入資料到集合的過程中可能會出現。假設建立乙個任務 job 在mongodb中進行千條更新操作,開始後迅速終止任務,終止所有更新操作,但依然發現新的更新任務在不斷出現,即使任務已經停止。原因是 如果使用非應答式寫入 unacknowledge write 載入資料,應用觸發寫入操作的速度可能...
MongoDB清理資料磁碟不釋放的解決方法
mongodb 不會釋放已經占用的硬碟空間,除非drop整個庫,有以下兩個方法可以釋放磁碟空間。方法一 在mongodb的shell中進入相應庫中執行db.repairdatabase 或db.runcommand 缺點是花費的時間並不短,要保證剩餘一定量磁碟空間,而且當repair databas...
MongoDB中刪除document的方法
刪除表裡面的行記錄 db.users.remove 刪除記錄 delete from users where z abc 預設remove沒有帶選項true false的話,是刪除匹配到的全部行記錄.如果要只刪除一條匹配到的記錄可以使用 db.users.remove true db.t1.dele...