Я реализую слой абстракции DAL поверх драйвера C # Mongo DB, используя шаблон Repository + Unit of Work.Мой текущий дизайн состоит в том, что каждая единица работы открывает (и закрывает) новый сеанс Mongo DB.Проблема заключается в том, что Mongo DB допускает только соотношение 1: 1 между сеансом и транзакцией, поэтому несколько единиц работы в рамках одной транзакции .NET будут невозможны.
Текущая реализация:
public class MongoUnitOfWork
{
private IClientSessionHandle _sessionHandle;
public MongoUnitOfWork(MongoClient mongoClient)
{
_sessionHandle = mongoClient.StartSession();
}
public void Dispose()
{
if (_sessionHandle != null)
{
// Must commit transaction, since the session is closing
if (Transaction.Current != null)
_sessionHandle.CommitTransaction();
_sessionHandle.Dispose();
}
}
}
И из-за этого следующий код не будет работать.Первая партия данных будет передана заранее:
using (var transactionScope = new TransactionScope())
{
using (var unitOfWork = CreateUnitOfWork())
{
//... insert items
unitOfWork.SaveChanges();
} // Mongo DB unit of work implementation will commit the changes when disposed
// Do other things
using (var unitOfWork = CreateUnitOfWork())
{
//... insert some more items
unitOfWork.SaveChanges();
}
transactionScope.Complete();
}
Очевидно, что немедленным ответом будет объединение всех изменений в одну единицу работы, но это не всегда возможно, а также это приводит к утечкеОграничение Mongo DB.
Я думал о пуле сеансов, так что несколько единиц работы будут использовать один и тот же сеанс и фиксировать / откатывать, когда временная транзакция завершается / прерывается.
Какие есть другие решениявозможно?
Пояснение:
Вопрос здесь конкретно касается реализации Unit-Of-Work над MongoDB с использованием встроенной поддержки транзакций MongoDB 4.0 (или более поздней).