Подтвердить что ты не робот

Поддержка транзакций в MongoDB

Я новичок в MongoDB. Я читал, что MongoDB does not support multi-document transactions здесь http://docs.mongodb.org/manual/faq/fundamentals/.

Если я хочу сохранить данные в двух коллекциях (A и B) атомарно, то я не могу сделать это с помощью MongoDB, то есть если сбой сбоя в случае B, все же A будет иметь данные. Разве это не большой недостаток?

Тем не менее, люди используют MongoDB, а не RDBMS. Почему?

4b9b3361

Ответ 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

Ответ 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/