Транзакции NHibernate в открытом просмотре на сеанс - рекомендуемые методы?

Очистил некоторую транзакционную логику и поинтересовался, как другие люди с этим справляются.

Рекомендация Айенде, похоже, состоит в том, чтобы обрабатывать транзакции на границе службы. Однако это веб-приложение ASP.NET, поэтому у него нет четких границ службы, по крайней мере, сейчас.

Что делают люди?

  • Создать одну транзакцию для каждого запроса в HttpModule и обработать фиксацию на EndRequest, откат при ошибке?
  • Создавать транзакции в реальных «службах» в приложении и обрабатывать их в нескольких местах?
  • Что-то другое?

person RasmusKL    schedule 25.12.2008    source источник


Ответы (2)


Большинство людей используют стратегию «сеанс на запрос», как указано в вашем первом пункте. Однако я не верю, что транзакцию нужно фиксировать по EndRequest. На многих веб-страницах было бы проще зафиксировать транзакцию на основе действия пользователя (например, щелчка на кнопке отправки) и позволить EndRequest просто обрабатывать удаление ISession.

Насколько я могу судить, нет необходимости создавать HttpModule, поскольку те же функции можно создать в global.asax: http://forum.hibernate.org/viewtopic.php?t=993041.

person Jamie Ide    schedule 27.12.2008

Вы можете использовать контейнер IoC для своего уровня обслуживания, и этот контейнер может управлять транзакцией и сеансом Nibenrate.

Контроллер WebApp => вызов (A) Уровень обслуживания => вызов (B) одного или нескольких методов / операций DAO.

Контейнер IoC, такой как Spring.NET, будет управлять областью действия TX, например, в (A) и предоставит сеанс для вашего DAO в (B). Фиксация (или откат) будет обработана в конце вызова уровня сервиса.

person MatthieuGD    schedule 15.02.2009