2013-03-12 4 views
5

Webアプリケーション用にNServiceBusを実行しているため、ユーザーが「バッチ式」の操作を行う状況を処理しています。同様に、1000個のエンティティに影響を与えるコマンドを実行します。NServicebusサービスを実行するとデッドロックが発生し、接続が壊れます

正常に動作しますが、中程度の負荷ではデッドロックが発生しますが、これは問題ではありません。 :)

次のメッセージが到着し、接続を開こうとするときに問題が発生します。接続が「破損しています」。 System.Data.SqlClient.SqlException(0x80131904):

は、我々は次のエラーを取得する新しい要求が、それは私がウェブを検索したと私は考えて

有効なトランザクション記述子に付属する必要があるために開始できません問題が報告されましたNH "bug"

接続プールを無効にするには、回避策が必要です。しかし、私はそれが好きではありません。パフォーマンスは低下します。

私たちはNHibernate 3.3のNServiceBus 2.6を実行しています。

誰もこの経験がありますか? NServiceBusのアップグレードは役に立ちますか?

+0

これは、私たちが持っている問題とよく似ています。私たちはまだそれを解決しておらず、現在プールしています。 MSDTCに関する設定は何ですか? –

+0

MS DTC Serverには2つのWebボックス(ハードウェア負荷分散、IPスティッキー)とフェールオーバーSQLサーバークラスタがあります。 –

+0

これで接続プールが無効になりましたが、問題は発生しなくなりました。 –

答えて

1

過去にこのように見てきましたが、設計が保証されている場合は、トランザクションを2つに分割してみてください。データベーストランザクションにメッセージトランザクションを流した場合、障害はカスケード効果をもたらし、 (理想的には、それ以降のメッセージも含めてはなりません)。

+0

もう少し明確にするために、ネストされたトランザクションを使用することを意味しました。データベーストランザクションは、メッセージトランザクション全体に影響を与えてはなりません。 –

+0

サガを使用してすべてを小さなショート・トランザクションに分割します。しかし、デッドロックが発生すると、接続プーリングがオンのときにエラーが発生します。 –

0

コマンドの1000個のエンティティを更新する代わりに、コマンドが完了したことを伝えるイベントを発行し、このイベントに対処するいくつかのサブスクライバにエフェクトエンティティを更新させることができます。 1000個のエンティティを更新するコマンドは、いくつかの小さなコマンドに分割する必要があります。長年走っているビジネスプロセスをどのように処理できるか見てみましょう。たとえば、プロセスの開始、ステップ1の完了、ステップ2の完了、プロセスの完了など...

+0

これが私たちの行うことです。例えば、ユーザはコマンドを、エンティティごとに1つに分割した1000個のエンティティに影響を及ぼすコマンドを発行します。そしてそれはサガで処理されます。 –

+0

しかし、トランザクションの1つがデッドロック状態になると、接続プールに返された接続は破損しています。サービスがメッセージを再試行すると、接続が破損し、新しいメッセージのトランザクションエラーメッセージが表示されます。 –

関連する問題