Могу ли я использовать как сеанс для веб-запроса, так и TransactionScope? - PullRequest
0 голосов
/ 20 сентября 2011

Знаете, чтобы реализовать сеанс на веб-запрос в веб-приложении, мы часто создаем сеанс в Application_BeginRequest и закрываем его в глобальных обработчиках событий Application_EndRequest. И затем каждый раз, когда мы получаем доступ к базе данных, мы получаем текущий сеанс с помощью GetCurrentSession вместо того, чтобы открывать новый сеанс с помощью OpenSession.

Так есть ли шанс использовать как сеанс на веб-запрос, так и TransactionScope в веб-приложении? В соответствии с поваренной книгой NHibernate 3.0 (стр. 117) говорится, что вызов TransactionScope.Complete должен происходить после завершения сеанса. Удивительно, но в нем ничего не сказано об этой ситуации, хотя в одной и той же главе обсуждаются как сеанс для каждого веб-запроса, так и использование TransactionScope.

using (var scope = new TransactionScope())
{
  using (var session = sessionFactory.OpenSession())
  using (var tx = session.BeginTransaction())
  {
     // do something here
  }

  scope.Complete();
}

1 Ответ

0 голосов
/ 20 сентября 2011

Я предполагаю, что в каждом запросе открыто более одного сеанса / транзакции (возможно, разные базы данных), что является единственной веской причиной для использования TransactionScope.

Если это так, просто создайте и выполните () свой TransactionScope в Application_BeginRequest / Application_EndRequest, так же, как вы делаете это для сеанса.

...