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 не будет зависеть от транзакции базы данных.

Это предчувствие, так как вы не указали детали ошибки в своем вопросе.

РЕДАКТИРОВАТЬ

Конечно, следуя этому совету, ваша фиксация базы данных не будет выполняться в рамках той же транзакции, что и действие удаления очереди, поэтому в случае сбоя в вашей базе данных это может или не может привести к тому, что транзакция удаления очереди откатит обрабатываемое сообщение обратно в очередь, так что вы рискуете сбросить сообщения таким образом. Вы можете компенсировать это различными способами или просто рискнуть, если стоимость пропущенных сообщений невысока.

Другие вопросы по тегам