Транзакции MongoDB? - PullRequest
       10

Транзакции MongoDB?

28 голосов
/ 16 апреля 2010

Игра с MongoDB и NoRM в .NET.

То, что меня смутило - нет транзакций
(не могу просто сказать MongoConnection.Begin/EndTransaction или что-то в этом роде).

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

Есть ли еще чистый способ, как обогатить мой репозиторий с помощью ITransaction?

Ответы [ 8 ]

30 голосов
/ 17 апреля 2010

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

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

20 голосов
/ 06 октября 2012

Это правда, что MongoDB не поддерживает транзакции из коробки, но вы можете реализовать оптимистичные транзакции самостоятельно. Они прекрасно подходят единице работы. Я написал пример Java и некоторые пояснения к GitHub , чтобы вы могли легко повторить в C #.

3 голосов
/ 18 февраля 2018

Начиная с версии 4.0 MongoDB поддерживает многодокументные транзакции ACID. Благодаря изоляции моментальных снимков транзакции обеспечивают глобально согласованное представление данных и обеспечивают выполнение «все или ничего» для поддержания целостности данных. Для получения дополнительной информации см. https://www.mongodb.com/transactions

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

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

1 голос
/ 23 февраля 2018

MongoDB 4.0 добавит поддержку многодокументных транзакций.

https://www.mongodb.com/transactions

0 голосов
/ 05 сентября 2018

Да, существует несколько способов применения шаблона единиц работы для MongoDB в зависимости от версии базы данных.

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

В MongoDB 4.0 добавлена ​​поддержка транзакций ACID с несколькими документами.

Источники:

https://en.wikipedia.org/wiki/Two-phase_commit_protocol

https://en.wikipedia.org/wiki/Three-phase_commit_protocol

https://www.mongodb.com/transactions

0 голосов
/ 14 августа 2018

К вашему сведению - теперь это изменилось

using (var session = mongoDbContext.MongoDatabase.Client.StartSession())
            {
                var itemAuthRepo = (Repository<ItemAuthorization, ObjectId>)mongoDbContext.ItemAuthorizations;
                var calendarRepo = (Repository<CalendarEvent, ObjectId>)mongoDbContext.Calendars;

                if (itemAuthRepo != null && calendarRepo!=null)
                {
                    session.StartTransaction();

                    try
                    {
                        itemAuthRepo.Collection.InsertOne(session, newItemAuthorization);
                        calendarRepo.Collection.InsertOne(session, cal);
                        session.CommitTransaction();
                    }
                    catch (Exception ex)
                    {
                        session.AbortTransaction();
                        throw;
                    }
                }
                else
                {
                    throw new Exception("IRepository was not casted to Repository");
                }
            }
0 голосов
/ 14 мая 2014

Вы можете использовать вместо MongoDb TokuMX.

http://www.tokutek.com/products/tokumx-for-mongodb/

TokuMXTM - это высокопроизводительный дистрибутив MongoDB с открытым исходным кодом, который значительно улучшил производительность и эффективность работы по сравнению с базовой MongoDB. TokuMX - это замена для MongoDB, обеспечивающая повышение производительности в 20 раз, уменьшение размера базы данных на 90% и поддержку транзакций ACID с MVCC.

0 голосов
/ 19 августа 2013

Некоторые заметки для записи.

Хотя MongoDB не поддерживает транзакции, он поддерживает атомарность в одном документе :

MongoDB поддерживает атомарные операции в одном документе. Учитывая возможности, предоставляемые вложенными документами, эта функция обеспечивает поддержку большого количества вариантов использования.

Также может быть интересна ручная запись о « Изолировать последовательность операций ». E.g.:

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

...