4

WCF MSMQサービス(Windowsサービスでホストされている)があります。私のメソッドには、TransactionScopeRequired属性があります。

Nhibernateを使用してデータをデータベースに保存しています。各呼び出しの後に、必ず各Nhibernateセッションを閉じたいと思います。

私はデータアクセスで次のアプローチ(城の施設を使用)を使用していました

using(var session = sessionManager.OpenSession())
using(var transaction = session.BeginTransaction())
{

 // do work
transaction.Commit()

}

しかし、メインのサービスメソッドが終了すると、Nhibernateセッションを既に破棄しているため、エラーが発生します。DTCは、コミットを実行するためにこれが必要だと思います。

私の質問は:

DTCがコミットした後(つまり、サービスメソッドを終了した後)にNhibernateセッションを閉じるための最良の方法は何でしょうか?

ありがとうございました。

4

1 に答える 1

3

コードを次のようにラップする場合

using (TransactionScope sc = new TransactionScope(TransactionScopeOption.Suppress)) 
{ 
     // code here 
     sc.Complete(); 
} 

その後、NHibernate はアンビエント トランザクションに参加しないため、DTC はデータベース トランザクションに依存しません。

質問でエラーの詳細を提供していないため、これは推測です。

編集

もちろん、このアドバイスに従えば、データベースのコミットはデキュー アクションと同じトランザクションでは実行されないため、データベースに障害が発生した場合、デキュー トランザクションが処理中のメッセージをキューにロールバックする場合としない場合があります。したがって、この方法でメッセージをドロップする危険があります。これをさまざまな方法で補うことができます。または、ドロップされたメッセージのコストが高くない場合は、単にリスクを冒すことができます.

于 2012-11-22T13:50:23.603 に答える