我正在开发一个多线程的应用程序,并使用NServiceBus和NHibernate与SQL Server 2008RC(使用DTC)。该过程有一个会话工厂。每个线程都有自己的Session,在事务完成时将其处理掉。我们间歇地看到下面的异常被抛出,它发生在启动过程后5分钟和启动过程后6小时。似乎没有一种模式何时发生。
当DTC事务中止时,看起来AbstractBatcher遇到了关闭命令的麻烦。
任何帮助都非常感激。
框架版本:v4.0.30319描述:该过程已终止 由于未处理的异常。例外信息: System.InvalidOperationException Stack:at System.Collections.Generic.Dictionary`2 + KeyCollection +枚举[[系统._ 佳能, mscorlib,版本= 4.0.0.0,文化=中性, PublicKeyToken = b77a5c561934e089],[系统。 _Canon,mscorlib, 版本= 4.0.0.0,文化=中立, PublicKeyToken = b77a5c561934e089]]。MoveNext()at NHibernate.AdoNet.AbstractBatcher.CloseCommands()at NHibernate.AdoNet.AbstractBatcher.Dispose(布尔)在 NHibernate.Impl.SessionImpl.Close()at NHibernate.Impl.SessionImpl.Dispose(Boolean)at NHibernate.Transaction.AdoNetWithDistributedTransactionFactory + LT;> 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) 在 System.Transactions.InternalTransaction.DistributedTransactionOutcome(System.Transactions.InternalTransaction, System.Transactions.TransactionStatus)at System.Transactions.Oletx.RealOletxTransaction.FireOutcome(System.Transactions.TransactionStatus) 在 System.Transactions.Oletx.OutcomeEnlistment.InvokeOutcomeFunction(System.Transactions.TransactionStatus) 在 System.Transactions.Oletx.OletxTransactionManager.ShimNotificationCallback(System.Object的, 布尔) System.Threading._ThreadPoolWaitOrTimerCallback.PerformWaitOrTimerCallback(System.Object的, 布尔值)
答案 0 :(得分:0)
看起来这是由于AbstractBatcher中的一些非线程安全的集合访问。当事务中止时,迭代命令列表。如果同时运行另一个命令,它将尝试将命令添加到命令列表。这会导致InvalidOperationException。
此问题已记录在NHibernate JIRA中并已修复为pull request。