在DTC事务关闭的NHibernate AbstractBatcher中的InvalidOperation

时间:2012-07-18 17:02:00

标签: nhibernate transactions nservicebus msdtc distributed-transactions

我正在开发一个多线程的应用程序,并使用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的,   布尔值)

1 个答案:

答案 0 :(得分:0)

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

此问题已记录在NHibernate JIRA中并已修复为pull request