Поддержка транзакций в MongoDB
Я новичок в MongoDB. Я читал, что MongoDB does not support multi-document transactions
здесь http://docs.mongodb.org/manual/faq/fundamentals/.
Если я хочу сохранить данные в двух коллекциях (A и B) атомарно, то я не могу сделать это с помощью MongoDB, то есть если сбой сбоя в случае B, все же A будет иметь данные. Разве это не большой недостаток?
Тем не менее, люди используют MongoDB, а не RDBMS. Почему?
Ответы
Ответ 1
MongoDB не поддерживает транзакции нескольких документов.
Однако MongoDB выполняет атомарные операции над одним документом. Часто эти атомные операции на уровне документа достаточны для решения проблем, которые потребуют транзакций ACID в реляционной базе данных.
Например, в MongoDB вы можете вставлять связанные данные во вложенные массивы или вложенные документы в один документ и обновлять весь документ в одной атомной операции. Реляционные базы данных могут представлять одни и те же данные с несколькими таблицами и строками, что потребует поддержки транзакций для автоматического обновления данных.
Ответ 2
MongoDB не поддерживает транзакции, но сохранение одного документа является атомарным.
Итак, лучше спроектировать схему базы данных таким образом, чтобы все данные, которые необходимо было сохранить атомарно, будут помещены в один документ.
Ответ 3
MongoDB не поддерживает транзакции, как в Relational DB. ACID постулирует в транзакциях полную функциональность, предоставляемую механизмами хранения в MySQL
Некоторые функции движка InnoDB в MySQL:
- Аварийное восстановление
- Двойной буфер записи
- Настройки автоматической фиксации
- Уровень изоляции
Это то, что сообщество MongoDB должно сказать:
MongoDB не поддерживает традиционную блокировку или сложные транзакции с откатом.
MongoDB стремится быть легким, быстрым и предсказуемым в своей производительности. Благодаря тому, что поддержка транзакций чрезвычайно проста, MongoDB может обеспечить большую производительность, особенно для секционированных или реплицированных систем с несколькими процессами сервера базы данных.
Цель транзакции состоит в том, чтобы убедиться, что вся база данных остается согласованной, когда выполняется несколько операций.
Но в отличие от большинства реляционных баз данных MongoDB не предназначен для работы на одном хосте. Он предназначен для установки в виде кластера из нескольких осколков, где каждый осколок представляет собой набор реплик нескольких серверов (возможно, в разных географических точках).
Но если вы все еще ищете способ сделать транзакции возможными:
- Попробуйте использовать атомарность уровня документа, предоставленную mongo
- двухэтапная фиксация в Mongo обеспечивает простой механизм транзакций для основных операций
- mongomvcc построен на вершине монго, а также поддерживает транзакцию, как говорится
- Гибрид MySQL и Mongo
Ответ 4
Обновления нескольких документов или "транзакции с несколькими документами" с использованием двухфазного фиксации, описанного здесь: http://docs.mongodb.org/manual/tutorial/perform-two-phase-commits/
Ответ 5
Этот вопрос довольно старый, но для всех, кто натыкается на эту страницу, вы можете использовать fawn. Это пакет npm, который решает эту проблему. Раскрытие: я написал его
Скажем, у вас есть два банковских счета, один принадлежит Джону Смиту, а другой принадлежит Broke Individual. Вы хотели бы перевести $20 от Джона Смита на Broke Individual. Предполагая, что все имена и фамилии являются уникальными, это может выглядеть так:
var Fawn = require("fawn");
var task = Fawn.Task()
//assuming "Accounts" is the Accounts collection
task.update("Accounts", {firstName: "John", lastName: "Smith"}, {$inc: {balance: -20}})
.update("Accounts", {firstName: "Broke", lastName: "Individual"}, {$inc: {balance: 20}})
.run()
.then(function(){
//update is complete
})
.catch(function(err){
// Everything has been rolled back.
//log the error which caused the failure
console.log(err);
});
Протест:
задачи в настоящее время не изолированы (работают над этим), поэтому, технически, возможно, что две задачи могут извлекать и редактировать один и тот же документ только из-за того, как работает MongoDB.
Это действительно просто общая реализация примера двух фазовых ошибок на сайте учебника: https://docs.mongodb.com/manual/tutorial/perform-two-phase-commits/
Ответ 6
Поддерживать только транзакцию отдельных документов.
Вы можете увидеть это: https://docs.mongodb.com/v3.2/tutorial/perform-two-phase-commits/