2012-01-21 11 views
1

IHttpModuleでTransactionScopeを使用している他の人の考えが不思議です。たとえば :NHIbernate IHttpModuleとTransactionScope

BeginRequest 
//start new TransactionScope 
// start UOW 
// Begin UOW transaction 

// do some stuff... 


EndRequest: 
// commit UOW 
// commit transaction scope 

が、httpリクエストの生活のためのオープンのTransactionScopeを保持するために、本当に賢明ですか? トランザクションMSMQに同時に書き込む必要があり、TransactionScopeが必要です。私はデータベース更新を永続化させ、MSMQメッセージを送信するか、それ以外の場合はすべてをロールバックします。

アドバイスはありますか?

答えて

3

ASP.NETではBeginRequestとEndRequestが同じスレッド(別名thread-agility)で発生する保証がないため、これはランダムに失敗します。トランザクションスコープは、作成されたスレッドとは別のスレッドに処理しようとすると例外をスローします。そのため、EndRequestがBeginRequestとは別のスレッドで実行される場合がありましたが、この例外がスローされました。詳細については

http://www.mattwrock.com/post/2010/12/26/Getting-TransactionScope-to-play-nice-with-NHibernate.aspx

+0

私は数時間後に掲載これを見つけました。私の他の問題は、TransactionScopeの問題を引き起こしたISession.Closeでした。 Close()を削除し、すべて正常に動作しました。それは実際にあなたが言及したBegin/End Requestの問題に私を導いた同じブログでした。助けてくれてありがとう! – TheITGuy

+0

心配しないで、喜んで手伝ってください!私は古い_threadの敏捷性+ log4net_コンボで多くの時間前に刺さってきました。 –

+0

誰かがこのソリューションの使い方の例を持っていますか? NhOuterTransactionScopeはセッションのようにhttpContetxに格納されますか? – Apocatastasis

関連する問題