NHibernate尝试在TransactionScope.Dispose上执行SQL命令

时间:2014-01-17 01:23:56

标签: c# sql-server-2008 nhibernate transactions transactionscope

我试图让TransactionScope和nhibernate无状态会话很好地一起玩,

我的工作单位在高级别看起来像这样

using(var scope = new TransactionScope())
{
    using (var transaction = session.BeginTransaction())
    {
        session.SaveOrUpdate(entity);
        transaction.Commit();
    }
    scope.Complete();
}

Source

我得到的问题是在提交/完成后处理TransactionScope时出现间歇性TransactionAbortedException

奇怪的是内部异常看起来是由于nHibernate在dispose期间尝试执行SQL命令并因完全已被调用而触发错误而导致:

   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()

似乎没有帮助。

任何想法如何阻止这种情况发生?

1 个答案:

答案 0 :(得分:0)

最终发现堆栈跟踪中的这一行:

NHibernate.Impl.SessionImpl.Flush()

指示存在标准会话(非无状态),此事务中有挂起的更改需要刷新,但仍不确定为什么它等待处理后才会刷新它们。无论哪种方式,我通过在处理工作单元之前刷新标准会话以及无状态会话来解决此问题