Транзакции в 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 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