Почему вы начинаете транзакцию, если читаете только во время этой транзакции?
Это совершенно не обязательно.
Хотя верно, что если вы установили режим разъединения соединения на 'after_transaction', соединение будет закрыто только после того, как транзакция будет зафиксирована или откатана. Так что в этих случаях действительно может быть удобно начать транзакцию, если вы хотите выполнить несколько действий чтения.
На самом деле то, что я в основном делаю, это:
Person p = null;
using( ISession s = sf.OpenSession())
{
With.Transaction (s, () => p = s.Get (1));
}
например.
Где 'With.Transaction
' - служебный метод, который запускает транзакцию, выполняет переданный делегат (действие), а затем фиксирует или откатывает транзакцию.
Очень похоже на это:
public static class With
{
public static void Transaction( ISession s, Action proc )
{
using( ITransaction thx = s.BeginTransaction () )
{
try
{
proc();
thx.Commit();
}
catch
{
thx.Rollback();
throw;
}
}
}
}
Но моя реализация все еще немного отличается, поскольку я не использую ISession
NHibernate напрямую.
Вместо этого я создал оболочку вокруг ISession
, и в этой оболочке я также отслеживаю текущую транзакцию (если она есть) для этого сеанса.
Таким образом, в методе With.Transaction
я могу проверить, есть ли в моем сеансе активная транзакция или нет, и затем я только начинаю транзакцию, если нет активной транзакции.
(Кредиты идут в Айенде за идею With.Transaction
).