NHibernate 3.0: TransactionScope и автоматическая очистка - PullRequest
6 голосов
/ 04 марта 2011

В NHibernate 3.0 FlushMode.Auto не работает только при выполнении внешней транзакции (то есть без запуска транзакции NHibernate).Должно ли это?

using (TransactionScope scope = new TransactionScope()) 
{
    ISession session = sessionFactory.OpenSession();
    MappedEntity entity = new MappedEntity() { Name = "Entity", Value = 20 };
    session.Save(entity);

    entity.Value = 30;
    session.SaveOrUpdate(entity);

    // This returns one entity, when it should return none
    var list = session.
               CreateQuery("from MappedEntity where Value = 20").
               List<MappedEntity>();
}

(пример бесстыдно украденного у этого связанного вопроса )

В исходном коде NHibernate я вижу, что он проверяет, выполняется ли транзакция (в SessionImpl.AutoFlushIfRequired), но соответствующий метод (SessionImpl.TransactionInProgress) не учитывает окружающие транзакции - в отличие от его двоюродного брата ConnectionManager.IsInActiveTransaction, который учитывает окружающие транзакции.

Ответы [ 5 ]

5 голосов
/ 04 марта 2015

Хорошие новости. Благодаря Джеффу Стерну (который прекрасно определил проблему) я обновил https://nhibernate.jira.com/browse/NH-3583, и благодаря персоналу NH уже есть исправление и запрос на извлечение , поэтомув следующем выпуске 4.1.xx эта проблема будет исправлена.

3 голосов
/ 06 марта 2011

Вы должны всегда использовать явную транзакцию NHibernate.

using (TransactionScope scope = new TransactionScope()) 
using (ISession session = sessionFactory.OpenSession())
using (ITransaction transaction = session.BeginTransaction())
{
    //Do work here
    transaction.Commit();
    scope.Complete();
}

Я вижу, вы также написали в списке разработчиков NH - хотя это может измениться в будущем, вот как это работает сейчас.

2 голосов
/ 07 марта 2011

Ответ, предоставленный Диего, не работает в случае, если у вас есть база данных оракула. ( выпущенный вопрос ). Сессия session.BeginTransaction не будет выполнена, поскольку соединение уже является частью транзакции.

Похоже, нам нужно написать некоторый код для решения этой проблемы в нашем приложении (WCF, NHibernate, Oracle), но кажется, что NHibernate должен предоставить «из коробки». Так что, если у кого-то есть хороший ответ, он будет очень признателен.

1 голос
/ 28 июня 2011

Я нашел ответ на этот вопрос для оракула.Проверьте это здесь: Проблема NHibernate TransactionScope с Oracle 11g

0 голосов
/ 26 февраля 2014

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

session.Flush (); }

Я проверил, что это работает с моей распределенной транзакцией, так как без этого я всегда получаю «транзакция прервана» при удалении TransactionScope.

Даже установить session.FlushMode для Commit не работает для меня.

...