“系列化”;隔离级别“;在MongoDB中,或丢失更新问题

“系列化”;隔离级别“;在MongoDB中,或丢失更新问题,mongodb,transactions,Mongodb,Transactions,我意识到MongoDB是一个NoSQL解决方案,但我想知道它是否具有某种与序列化级别事务隔离级别等效的功能 如果没有,您将如何解决MongoDB中的丢失更新问题 我想在Mongo中保留一些数据的修订历史记录,每个修订都必须指向它之前的一个。如何确保我的数据不存在超过一个最新版本,另一方面,如何确保没有版本因并发更新而丢失 **编辑** 哦,RTFM,确实有可能: 不确定我是否应该结束这个问题,因为知识可能与其他人相关。是的,这是可能的,只要您将历史记录保存在单个文档中。MongoDB支持在文档范

我意识到MongoDB是一个NoSQL解决方案,但我想知道它是否具有某种与序列化级别事务隔离级别等效的功能

如果没有,您将如何解决MongoDB中的丢失更新问题

我想在Mongo中保留一些数据的修订历史记录,每个修订都必须指向它之前的一个。如何确保我的数据不存在超过一个最新版本,另一方面,如何确保没有版本因并发更新而丢失

**编辑**

哦,RTFM,确实有可能:


不确定我是否应该结束这个问题,因为知识可能与其他人相关。

是的,这是可能的,只要您将历史记录保存在单个文档中。MongoDB支持在文档范围内,但不支持跨集合中的多个文档

因此,您可以使用如下模式将历史嵌入数组:

{
    _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" } }
    }
)

更多内容:在linux上运行,对使用文件锁定的解决方案不感兴趣。CouchDB有一种乐观锁,如果更新使用过时的版本id,它将被拒绝。这就解决了问题。不确定Mongo是否有类似的情况。