0

我正在开发一个多线程应用程序,并使用 NServiceBus 和 NHibernate 与 SQL Server 2008RC(使用 DTC)。该进程有一个会话工厂。每个线程都有自己的 Session ,在事务完成时被处理掉。我们间歇性地看到下面的异常被抛出,它发生在启动进程后 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]].MoveNext() 在 NHibernate.AdoNet.AbstractBatcher.CloseCommands() 在 NHibernate.AdoNet.AbstractBatcher.Dispose(Boolean) 在 NHibernate.Impl.SessionImpl .Close() 在 NHibernate.Impl.SessionImpl.Dispose(Boolean) 在 NHibernate.Transaction.AdoNetWithDistributedTransactionFactory+<>c_ DisplayClass1.b_0(System.Object, System.Transactions.TransactionEventArgs) 在 System.Transactions.TransactionCompletedEventHandler.Invoke(System.Object, System.Transactions.TransactionEventArgs) 在 System.Transactions.TransactionStatePromotedAborted.EnterState(System.Transactions.InternalTransaction) 在 System.Transactions .InternalTransaction.DistributedTransactionOutcome(System.Transactions.InternalTransaction, System.Transactions.TransactionStatus) 在 System.Transactions.Oletx.RealOletxTransaction.FireOutcome(System.Transactions.TransactionStatus) 在 System.Transactions.Oletx.OutcomeEnlistment.InvokeOutcomeFunction(System.Transactions.TransactionStatus) ) 在 System.Threading._ThreadPoolWaitOrTimerCallback 的 System.Transactions.Oletx.OletxTransactionManager.ShimNotificationCallback(System.Object, Boolean)。PerformWaitOrTimerCallback(System.Object, Boolean)

4

1 回答 1

0

看起来这是由于 AbstractBatcher 中的一些非线程安全集合访问。当事务中止时,将迭代命令列表。如果同时运行另一个命令,它将尝试将该命令添加到命令列表中。这会导致 InvalidOperationException。

该问题已记录在NHibernate JIRA并在pull request中修复。

于 2012-08-07T10:34:52.023 回答