DTC事务关闭时NHibernate AbstractBatcher中的无效操作

DTC事务关闭时NHibernate AbstractBatcher中的无效操作,nhibernate,transactions,nservicebus,msdtc,distributed-transactions,Nhibernate,Transactions,Nservicebus,Msdtc,Distributed Transactions,我正在开发一个多线程的应用程序,使用NServiceBus和NHibernate与SQLServer2008RC(使用DTC)配合使用。该进程有一个会话工厂。每个线程都有自己的会话,当事务完成时,该会话将被释放。我们间歇性地看到下面的异常被抛出,它发生在流程启动5分钟后和流程启动6小时后。它发生的时间似乎没有规律可循 当DTC事务中止时,AbstractBatcher似乎在关闭命令时遇到问题 非常感谢您的帮助 框架版本:v4.0.30319说明:进程已终止 由于未处理的异常。例外信息: Syst

我正在开发一个多线程的应用程序,使用NServiceBus和NHibernate与SQLServer2008RC(使用DTC)配合使用。该进程有一个会话工厂。每个线程都有自己的会话,当事务完成时,该会话将被释放。我们间歇性地看到下面的异常被抛出,它发生在流程启动5分钟后和流程启动6小时后。它发生的时间似乎没有规律可循

当DTC事务中止时,AbstractBatcher似乎在关闭命令时遇到问题

非常感谢您的帮助

框架版本:v4.0.30319说明:进程已终止 由于未处理的异常。例外信息: System.InvalidOperationException堆栈:位于 System.Collections.Generic.Dictionary`2+KeyCollection+Enumerator[[System.\u Canon, mscorlib,版本=4.0.0.0,区域性=中性, PublicKeyToken=b77a5c561934e089],[System.\u佳能,mscorlib, 版本=4.0.0.0,区域性=中性, PublicKeyToken=b77a5c561934e089]]。移动下一步()位于 NHibernate.AdoNet.AbstractBatcher.CloseCommands()位于 NHibernate.AdoNet.AbstractBatcher.Dispose(布尔值)位于 NHibernate.Impl.SessionImpl.Close()位于 NHibernate.Impl.SessionImpl.Dispose(布尔值)位于 NHibernate.Transaction.adonnetwithDistributedTransactionFactory+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.DistributedTransactionOutput(System.Transactions.InternalTransaction, System.Transactions.TransactionStatus)位于 System.Transactions.Oletx.RealOletxTransaction.firefoutput(System.Transactions.TransactionStatus) 在 System.Transactions.Oletx.OutcomeEnrolment.InvokeoutCommand函数(System.Transactions.TransactionStatus) 在 System.Transactions.Oletx.OletxTransactionManager.ShimNotificationCallback(System.Object, 布尔)at System.Threading.\u ThreadPoolWaitorTimeCarlBack.PerformWaitorTimeCarlBack(System.Object, 布尔值)


这似乎是由于AbstractBatcher中存在一些非线程安全的集合访问。事务中止时,命令列表将被迭代。如果同时运行另一个命令,它将尝试将该命令添加到命令列表中。这会导致InvalidOperation异常


该问题已登录并在中修复。

只是好奇-为什么您不能为流程设置一个会话工厂,而只为每条消息打开/关闭会话?很抱歉,这就是我们正在做的,更正了上面的问题。会话是使用Castle容器中的作用域生活方式注入的,因此我们会为每条消息获取一个新的会话。关于事务中止的原因,有什么线索吗?