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

发布于 2024-11-08 21:07:29 字数 413 浏览 1 评论 0原文

我意识到 MongoDB 是一个 NoSQL 解决方案,但我想知道它是否具有某种相当于序列化级别的事务隔离级别。

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

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

** 编辑 **

哎呀,RTFM,确实有可能: http://www.mongodb .org/display/DOCS/Atomic+Operations

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

I realize MongoDB is a NoSQL solution, but I was wondering if it had some sort of equivalent to serialization-level transaction isolation level.

If not, how would you solve the lost-update problem in MongoDB?

I want to keep the revision history of some data in Mongo and each revision has to point to the one before it. How can I make sure no more than one latest revision exists for my data, and on the other hand that no revision is lost due to concurrent updates?

** Edit **

Oops, RTFM, it is indeed possible: http://www.mongodb.org/display/DOCS/Atomic+Operations

Not sure if I should close the question since the knowledge might be relevant to other people..

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

溺渁∝ 2024-11-15 21:07:29

是的,这是可能的,只要您将历史记录保存在单个文档中即可。 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" } }
    }
)

Yes, this is possible, so long as you keep the history in a single document. MongoDB supports atomic updates within the scope of a document, but not across multiple documents in a collection.

So, you could embed the history in an array, using a schema something like this:

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

For example, you could insert a new document:

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

Then update it in one atomic operation:

db.things.update( { _id: 123 },
    {
        $set: { value: "Orange" },
        $push : { history : { revisionid: 1, value: "Apple" } }
    }
)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文