NHibernate пытается выполнить команду SQL на TransactionScope.Dispose

Я пытаюсь заставить TransactionScope и nhibernate сеансов бездействия играть вместе,

Мой класс работы выглядит так на высоком уровне

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

Источник

Проблема, которую я получаю, представляет собой прерывистое TransactionAbortedException, когда TransactionScope располагает после фиксации/завершения

Самое странное - это внутреннее исключение, вызванное тем, что nHibernate пытается выполнить команду 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 ответ

В конце концов выяснилось, что эта строка в трассе стека:

NHibernate.Impl.SessionImpl.Flush()

Указывал, что существует стандартная сессия (не без гражданства) с ожидающими изменений в этой транзакции, которые нужно было очистить, но не уверен, почему она ждала, пока после того, как они сбросят их. В любом случае, я исправил это, сбросив стандартную сессию, а также без гражданства, прежде чем удалять единицы работы

licensed under cc by-sa 3.0 with attribution.