«Уровень изоляции» сериализации в MongoDB или проблема потерянных обновлений - PullRequest
8 голосов
/ 20 мая 2011

Я понимаю, что MongoDB - это решение NoSQL, но мне было интересно, есть ли у него какой-то эквивалент уровня изоляции транзакций на уровне сериализации.

Если нет, то как бы вы решили проблему потерянного обновления в MongoDB?

Я хочу сохранить историю изменений некоторых данных в Mongo, и каждая версия должна указывать на предыдущую. Как я могу убедиться, что для моих данных существует не более одной последней редакции, а с другой стороны, что ни одна редакция не потеряна из-за одновременных обновлений?

** Редактировать **

Упс, RTFM, это действительно возможно: http://www.mongodb.org/display/DOCS/Atomic+Operations

Не уверен, стоит ли мне закрывать вопрос, поскольку знания могут иметь отношение к другим людям.

1 Ответ

6 голосов
/ 21 мая 2011

Да, это возможно, если вы храните историю в одном документе. 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" } }
    }
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...