Свободная обработка исключений сеанса NHibernate

Как обрабатывать исключения NHibernate во время сеансов? Есть много примеров через Интернет:

http://nhibernate.info/doc/nh/en/index.html https://svn.code.sf.net/p/nhibernate/code/trunk/nhibernate/src/NHibernate/ISession.cs

И многие, многие потоки StackOwerflow, которые предлагают подход, подобный этому:

using (ISession session = factory.OpenSession())
using (ITransaction tx = session.BeginTransaction())
    {
        try
        {
            // do some work
            ...
            tx.Commit();
        }
        catch (Exception e)
        {
            if (tx != null) tx.Rollback();
                throw;
        }
    }

Но что, если произойдет ошибка и на 1-ю строку кода будет сгенерировано исключение (когда вы открываете сеанс)? Ни один из примеров не покрывает это!

Мой коллега предложил этот подход:

ITransaction transaction = null;
    try
    {
        using (ISession session = databaseFacade.OpenSession())
        {
            transaction = session.BeginTransaction();
            //do some work
            ...

            transaction.Commit();
        }
    }
    catch (Exception ex)
    {
        if (transaction != null)
            transaction.Rollback();

        throw new Exception(ex.Message);
    }

1 ответ

Решение

Я предлагаю отделить компоненты, которые

  • открытая сессия
  • выполнять операции дб

с этим подходом вы можете сохранить логику для обработки OpenSession() исключения внутри вашей 1-й строки и не беспокойтесь позже. Причина в том, что если (как в вашем случае) databaseFacade.OpenSession() выдает исключение, вы не должны ловить его и проверять transaction так как это должно быть null

    //if OpenSession() throws it's fine , not transaction at all
    using (ISession session = databaseFacade.OpenSession())
    {
        using (ITransaction tx = session.BeginTransaction())
        {
          try
          {
              // do some work
              ...
              tx.Commit();
          }
          catch (Exception e)
          {
            //tx is not null at this point
            tx.Rollback();
            throw;
          }
        }
    }
Другие вопросы по тегам