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

игра с MongoDB и нормой .Сеть.

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

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

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

8 ответов


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

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


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


по состоянию на v4.0 (летом 2018 года) MongoDB будет поддерживать транзакции с несколькими документами ACID. Благодаря изоляции моментальных снимков транзакции обеспечивают глобально согласованное представление данных и принудительное выполнение "все или ничего" для поддержания целостности данных. Для получения дополнительной информации и бета-версии см. https://www.mongodb.com/transactions

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


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

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

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

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

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


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

https://www.mongodb.com/transactions


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

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

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


FYI - теперь это изменилось

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");
                }
            }

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

до MongoDB 4.0 не было поддержки многодокументных транзакций ACID. Затем разработчики использовали " двухфазный протокол фиксации "(single database) и" трехфазный протокол фиксации " (non-blocking on distributed databases) для создания собственного уровня транзакций, который обеспечил согласованность данных а не выполнение "все или ничего" для обслуживания данных цельность. Таким образом, это разрушило представление.

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