Свободная обработка исключений сеанса 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;
}
}
}