WCF с MSMQ DTC - закрытие сессий NHibernate
У меня есть служба WCF MSMQ (размещена в службе Windows). Мой метод имеет атрибут TransactionScopeRequired.
Я использую Nhibernate, чтобы сохранить мои данные в моей базе данных. Я хочу убедиться, что я закрываю каждый сеанс Nhibernate после каждого вызова.
Я использовал следующий подход (используя средство замка) в моем доступе к данным
using(var session = sessionManager.OpenSession())
using(var transaction = session.BeginTransaction())
{
// do work
transaction.Commit()
}
Но когда мой основной метод обслуживания завершается, я получаю сообщение об ошибке, потому что я уже удалил сеанс Nhibernate, и я думаю, что DTC нуждается в этом для выполнения своей фиксации.
Мой вопрос:
Что было бы лучшим способом закрыть сеанс Nhibernate - после того, как DTC зафиксировал (т.е. после того, как я вышел из моего метода обслуживания?).
Спасибо.
1 ответ
Если вы заверните свой код в следующем
using (TransactionScope sc = new TransactionScope(TransactionScopeOption.Suppress))
{
// code here
sc.Complete();
}
Тогда NHibernate не будет подключен к внешней транзакции, и поэтому DTC не будет зависеть от транзакции базы данных.
Это предчувствие, так как вы не указали детали ошибки в своем вопросе.
РЕДАКТИРОВАТЬ
Конечно, следуя этому совету, ваша фиксация базы данных не будет выполняться в рамках той же транзакции, что и действие удаления очереди, поэтому в случае сбоя в вашей базе данных это может или не может привести к тому, что транзакция удаления очереди откатит обрабатываемое сообщение обратно в очередь, так что вы рискуете сбросить сообщения таким образом. Вы можете компенсировать это различными способами или просто рискнуть, если стоимость пропущенных сообщений невысока.