у нас есть приложение asp.net webforms, использующее NHibernate. Вот некоторые особенности:
- Нам нужны распределенные транзакции, потому что мы пишем в базу данных, а также в очередь.
- Поскольку это веб-приложение, мы используем рекомендованный шаблон Session-in-view. У нас есть HTTPModule, который открывает сеанс NHibernate для события BeginRequest и закрывает его для EndRequest.
- Внутри потока запроса у нас есть несколько отдельных моментов, когда нам нужно выполнить транзакционную работу. Для этого мы используем TransactionScope.
Итак, в основном, что происходит (псевдокод):
using(var session = sessionFactory.CreateSession()){
using(var tx1 = new TransactionScope(){
//work work work
tx1.Complete();
}
//other work
using(var tx2 = new TransactionScope(){
//work work work
tx2.Complete();
}
}
Однако сейчас мы попадаем в ситуацию, когда мы видим множество сбоев, связанных с подключением к базе данных. Некоторые исследования дали нам два предложения:
- Использование транзакции NHibernate в пределах вашей транзакции
- Создайте сеанс в вашей транзакции
Однако у нас есть два вопроса по поводу этих предложений:
- NHibernate не подключается автоматически в TransactionScope. Зачем нам нужно явно создавать транзакцию для NHibernate?
- Если мы должны создать наш сеанс в TransactionScope, как мы можем совместить это с шаблоном Session-in-view?