Я вижу несколько проблем с тем, как вы используете NHibernate.
1) Если вы используете NHibernate с настройками по умолчанию, он работает в режиме сброса AUTO, что означает, что изменения иногда сбрасываются в БД при выполнении запроса, чтобы избежать устаревших результатов. Это может означать, что данные будут преждевременно очищены вне вашей транзакции.
2) Когда ваша транзакция охватывает только операцию сброса, чтения происходят вне транзакции и не подлежат тому же уровню изоляции, что и транзакция. Чтобы транзакция была по-настоящему атомарной и изолированной, вам нужно начать транзакцию сразу после создания сеанса.
Лучше было бы что-то вроде этого:
public class UnitOfWork : IDisposable
{
ISession currentSession;
bool shouldCommit;
public UnitOfWork()
{
currentSession = KctcSessionFactory.OpenSession();
currentSession.BeginTransaction();
}
public void Commit()
{
shouldCommit = true;
}
public void Dispose()
{
if (shouldCommit)
{
currentSession.Transaction.Commit();
}
else
{
currentSession.Transaction.Rollback();
}
currentSession.Dispose();
}
}
позволяет использовать сценарии использования, когда кому-то нужно каким-то образом проверять, успешно ли выполнен веб-запрос без исключений, вызывая Commit
на текущем uow, если это имело место.
Имеет ли это смысл?