0

マルチスレッドで、SQL Server 2008RCでNServiceBusとNHibernateを使用している(DTCを使用している)アプリケーションに取り組んでいます。プロセスには1つのセッションファクトリがあります。各スレッドには独自のセッションがあり、トランザクションが完了すると破棄されます。以下の例外が断続的にスローされます。これは、プロセスの開始から5分後、およびプロセスの開始から6時間後に発生します。それがいつ起こるかについてのパターンはないようです。

DTCトランザクションが中止されたときに、AbstractBatcherがコマンドを閉じる際に問題が発生しているようです。

どんな助けでも大歓迎です。

フレームワークバージョン:v4.0.30319説明:未処理の例外が原因でプロセスが終了しました。例外情報:System.InvalidOperationExceptionスタック:System.Collections.Generic.Dictionary`2 + KeyCollection + Enumerator [[System._ Canon、mscorlib、Version = 4.0.0.0、Culture = neutral、PublicKeyToken = b77a5c561934e089]、[System。_Canon、mscorlib、Version = 4.0.0.0、Culture = neutral、PublicKeyToken = b77a5c561934e089]]。NoveNext()at NHibernate.AdoNet.AbstractBatcher.CloseCommands()at NHibernate.AdoNet.AbstractBatcher.Dispose(Boolean)at NHibernate.Impl.SessionImpl .Close()at NHibernate.Impl.SessionImpl.Dispose(Boolean)at NHibernate.Transaction.AdoNetWithDistributedTransactionFactory + <> c_ DisplayClass1.b_0(System.Object、System.Transactions.TransactionEventArgs)at System.Transactions.TransactionCompletedEventHandler.Invoke(System.Object、System.Transactions.TransactionEventArgs)at System.Transactions.TransactionStatePromotedAborted.EnterState(System.Transactions.InternalTransaction)at System.Transactions .InternalTransaction.DistributedTransactionOutcome(System.Transactions.InternalTransaction、System.Transactions.TransactionStatus)at System.Transactions.Oletx.RealOletxTransaction.FireOutcome(System.Transactions.TransactionStatus)at System.Transactions.Oletx.OutcomeEnlistment.InvokeOutcomeFunction(System )at System.Transactions.Oletx.OletxTransactionManager.ShimNotificationCallback(System.Object、Boolean)atSystem.Threading._ThreadPoolWaitOrTimerCallback。PerformWaitOrTimerCallback(System.Object、Boolean)

4

1 に答える 1

0

これは、AbstractBatcher での非スレッドセーフ コレクション アクセスが原因のようです。トランザクションが中止されると、コマンドのリストが繰り返されます。別のコマンドが同時に実行されている場合、そのコマンドをコマンドのリストに追加しようとします。これにより、InvalidOperationException が発生します。

この問題はNHibernate JIRAに記録され、プル リクエストで修正されました。

于 2012-08-07T10:34:52.023 に答える