C# NHibernate试图在TransactionScope.Dispose上执行SQL命令
我正在努力使TransactionScope和nhibernate无状态会话能够很好地协同工作 我的工作单元在高水平上看起来是这样的C# NHibernate试图在TransactionScope.Dispose上执行SQL命令,c#,sql-server-2008,nhibernate,transactions,transactionscope,C#,Sql Server 2008,Nhibernate,Transactions,Transactionscope,我正在努力使TransactionScope和nhibernate无状态会话能够很好地协同工作 我的工作单元在高水平上看起来是这样的 using(var scope = new TransactionScope()) { using (var transaction = session.BeginTransaction()) { session.SaveOrUpdate(entity); transaction.Commit(); }
using(var scope = new TransactionScope())
{
using (var transaction = session.BeginTransaction())
{
session.SaveOrUpdate(entity);
transaction.Commit();
}
scope.Complete();
}
我遇到的问题是,当TransactionScope在提交/完成后处理时,会出现间歇性TransactionBortedException
wierd的问题是,内部异常似乎是由nHibernate在dispose过程中试图执行SQL命令引起的,并由于已调用complete而触发错误:
at NHibernate.AdoNet.SqlClientBatchingBatcher.DoExecuteBatch(IDbCommand ps)
at NHibernate.AdoNet.AbstractBatcher.ExecuteBatchWithTiming(IDbCommand ps)
at NHibernate.AdoNet.AbstractBatcher.ExecuteBatch()
at NHibernate.Engine.ActionQueue.ExecuteActions()
at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session)
at NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event)
at NHibernate.Impl.SessionImpl.Flush()
at NHibernate.Transaction.AdoNetWithDistributedTransactionFactory.DistributedTransactionContext.System.Transactions.IEnlistmentNotification.Prepare(PreparingEnlistment preparingEnlistment)
在完成之前,我已尝试手动刷新无状态会话,请使用:
session.GetSessionImplementation().Flush()
似乎没用
有没有办法阻止这种情况发生?最终发现堆栈跟踪中的这一行: NHibernate.Impl.SessionImpl.Flush() 表示有一个标准会话(非无状态)需要刷新此事务中的挂起更改,但仍不确定为什么要等到dispose之后才刷新这些更改。不管怎样,我都通过在处理工作单元之前刷新标准会话和无状态会话来解决这个问题