Транзакция с несколькими документами в MongoDB — пример книги и автора

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

У меня есть класс Book и класс Author, которые имеют отношения «многие ко многим». Теперь, когда я сохраняю конкретную книгу, у нее может быть несколько авторов. Сначала я сохраняю/обновляю авторов, включая сгенерированный идентификатор книги, а затем сохраняю класс книги с идентификаторами авторов. Теперь, как я могу гарантировать, что это сохранение нескольких документов соответствует свойствам транзакции?

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

До сих пор я использовал альтернативу «отката» и «фиксации» путем теневого резервного копирования документов, но в долгосрочной перспективе это невозможно, поскольку удваивает размер базы данных. Кроме того, я хотел бы знать, почему MongoDB не имеет встроенного метода для обработки транзакций.


person Koustuv Sinha    schedule 24.10.2013    source источник
comment
Tbh, независимо от того, насколько вы притворяетесь, что клиентская сторона MongoDB не имеет транзакций с несколькими документами, создание их не является хорошим учебным упражнением, вместо этого вы должны научиться принимать возможную согласованность.   -  person Sammaye    schedule 24.10.2013


Ответы (1)


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

Транзакции тяжелые. Я думаю, есть три аргумента, почему можно жить без них:

  1. В SQL транзакции чрезвычайно важны, потому что вы разбиваете объекты. В счете-фактуре нет позиций в SQL, но строки ссылаются на счет-фактуру. Таким образом, частичная фиксация может привести к тому, что в счете-фактуре будет отсутствовать половина позиций (но все работает). Поскольку MongoDB поддерживает встраивание, вам не нужно разделять все объекты, а потребность в соединениях и транзакциях намного меньше (хотя в целом будьте осторожны с встраиванием).

  2. Транзакции БД — это хорошо, но довольно часто требуются бизнес-транзакции, т. е. гораздо более длительная операция, которая, возможно, должна ждать вызовов API, взаимодействия с пользователем и т. д. Эта логика, включая логику отката такая транзакция должна обрабатываться в коде приложения.

  3. Масштабируемость: Транзакции сложны на одной машине, но они жестоки в сегментированной и реплицированной среде. Вам нужен координатор транзакций, который где-то сидит, ждет, пока все не будет завершено, и вернется, или, в конце концов, объявит об уходе и отправит откат. Теперь image есть сетевой раздел или координатор транзакций выходит из строя... Все это сложно реализовать и жует производительность. Это также скрывает от разработчиков значительную сложность. Опять же, лучше обрабатывать это в коде приложения или использовать другие стратегии, такие как MVCC (многоверсионный параллелизм). контроль).

person mnemosyn    schedule 24.10.2013