2015-11-25 49 views
0

例如,對於查找和保存文件MongoDB中:對於NOSql的ACID沒有保證,那麼如何確保一致性?

Article article1 = mongoOperation.findOne(new Query(Criteria.where("_id").is(1)), Article.class); 
mongoOperation.save(article.setAttrA("A")); 
Article article2 = mongoOperation.findOne(new Query(Criteria.where("_id").is(1)), Article.class); 
mongoOperation.save(article.setAttrB("B")); 

默認情況下,_id是主鍵,以便第一條和第二條的文件是相同的。

是否有可能爲第2條獲得過時的文檔,該文檔中attrA尚未設置爲A,因爲在理論上MongoDB不遵循ACID屬性。

回答

2

是的,第二個查詢可能會在應用保存之前返回相同的文檔。

事實上,如果您使用的是異步API,具有不安全寫入問題的同步API或具有偏好副本集副本(通常缺少幾秒鐘)的讀取首選項,這很可能會發生。

您可以做的檢測和處理編輯衝突的方法是向每篇文章添加一個修訂版本ID,在每次編輯時您都會增加一個。當您更新了一篇文章,你可以使用更新,而不是保存,就像這樣:

article.revision++; 
writeResult = db.articles.update(
    { _id: article._id, revision: article.revision -1 }, 
    article, 
    { writeConcern: WriteConcern.ReplicaAcknowledged} 
); 

當有人編輯在此之前的文章,與舊版本-ID的文章將不再在數據庫中,你會得到writeResult.nModified == 0

+0

謝謝你的回答。還有一個問題需要確認,即使沒有副本集,MongoDB的不一致性是否仍然存在?換句話說,我可以說修改id方法總是必要的,以確保一致性嗎? – fmchan

相關問題