2011-05-20 29 views
8

我意識到MongoDB是NoSQL解決方案,但我想知道它是否具有某種與串行級事務隔離級別相當的性能。MongoDB中的序列化「隔離級別」或者更新丟失的問題

如果不是,您將如何解決MongoDB中的丟失更新問題?

我想在Mongo中保留一些數據的修訂歷史,每個修訂都必須指向它之前的修訂歷史。如何確保我的數據不超過一個最新版本,另一方面,由於併發更新,不會有任何修訂版本丟失?

**編輯**

哎呀,RTFM,這的確是可能的:http://www.mongodb.org/display/DOCS/Atomic+Operations

不知道我是否應該關閉的問題,因爲知識可能涉及其他人..

+0

只是更多的上下文:運行在Linux和不感興趣的解決方案使用文件鎖定。 – 2011-05-20 15:57:01

+0

例如CouchDB有一些樂觀的鎖定,如果更新使用過時的rev ID,它將被拒絕。解決了這個問題。不確定Mongo是否有類似的東西。 – 2011-05-20 16:10:03

回答

6

是的,只要您將歷史記錄保存在單個文檔中,這是可能的。 MongoDB在文檔範圍內支持atomic updates,但不支持集合中的多個文檔。

所以,你可以嵌入歷史的陣列,使用的模式是這樣的:

{ 
    _id: 12345, 
    value: "Apple", 
    history: 
    [ 
     { revisionid: 2, value: "Orange" }, 
     { revisionid: 1, value: "Pear" } 
    ] 
} 

例如,你可以插入一個新的文件:

db.things.insert({ _id: 123, value: "Apple" }) 

然後更新了它一個原子操作:

db.things.update({ _id: 123 }, 
    { 
     $set: { value: "Orange" }, 
     $push : { history : { revisionid: 1, value: "Apple" } } 
    } 
)