it-swarm.com.ru

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

Я новичок в MongoDB. Я прочитал это MongoDB does not support multi-document transactionshere http://docs.mongodb.org/manual/faq/fundamentals/ .

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

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

14
Anand

MongoDB не поддерживает мультидокументы транзакции.

Однако MongoDB обеспечивает атомарные операции над одним документом. Часто эти атомарные операции на уровне документа достаточны для решения проблем, которые требуют транзакций ACID в реляционной базе данных.

Например, в MongoDB вы можете встраивать связанные данные во вложенные массивы или вложенные документы в один документ и обновлять весь документ за одну атомарную операцию. Реляционные базы данных могут представлять данные одного и того же типа с несколькими таблицами и строками, что потребует поддержки транзакций для атомарного обновления данных.

9
Tony

MongoDB не поддерживает транзакции, но сохранение одного документа является атомарным.

Поэтому лучше спроектировать схему базы данных таким образом, чтобы все данные, которые должны быть сохранены атомарно, были помещены в один документ.

4
stalk

MongoDB не поддерживает транзакции, как в реляционной БД. Постулаты ACID в транзакциях - это совершенно другая функциональность, предоставляемая механизмами хранения в MySQL

Некоторые особенности движка InnoDB в MySQL:

  • Восстановление после сбоя
  • Двойной буфер записи
  • Настройки автоматической фиксации
  • Уровень изоляции

Вот что говорит сообщество MongoDB:

MongoDB не поддерживает традиционную блокировку или сложные транзакции с откатом. 

MongoDB стремится быть легким, быстрым и предсказуемым в своей работе. Поддерживая чрезвычайно простую поддержку транзакций, MongoDB может обеспечить более высокую производительность, особенно для многораздельных или реплицируемых систем с несколькими процессами сервера базы данных.

Цель транзакции состоит в том, чтобы убедиться, что вся база данных остается согласованной во время выполнения нескольких операций. 

Но в отличие от большинства реляционных баз данных, MongoDB не предназначен для работы на одном хосте. Он предназначен для установки в виде кластера из нескольких сегментов, где каждый фрагмент представляет собой наборы из нескольких серверов (возможно, в разных географических точках).

Но если вы все еще ищете способ сделать транзакции возможными:

  • Попробуйте использовать атомарность на уровне документа, предоставленную Монго
  • двухфазная фиксация в Mongo предоставляет простой механизм транзакций для основных операций
  • mongomvcc построен на вершине Монго и, как говорится, поддерживает транзакции
  • Гибрид MySQL и Монго
3
keshav

Этот вопрос довольно старый, но для любого, кто наткнется на эту страницу, вы можете использовать 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/

1
oj_1boss

В MongoDB 4.0 добавлена ​​поддержка многодокументных транзакций ACID . Для справки См. Refrence

1
Mithilesh Jha

Обновления с несколькими документами или «транзакции с несколькими документами» с использованием подхода двухфазной фиксации, описанного здесь: http://docs.mongodb.org/manual/tutorial/perform-two-phase-commits/

1
Rahatur

Начиная с версии 4.0, MongoDB добавит поддержку многодокументных транзакций. Таким образом, у вас будут возможности модели документа с гарантиями ACID в MongoDB . Транзакции в MongoDB будут похожи на транзакции в реляционных базах данных.

Для получения дополнительной информации перейдите по этой ссылке: https://www.mongodb.com/blog/post/multi-document-transactions-in-mongodb?jmp=community

0
Pranab Sharma