2014-10-19 2 views
0

Мой вопрос прост. У меня есть код ниже, и пользователь все еще вставлен. Когда я проверяю базу данных сразу после SaveOrUpdate (и перед откатом), я вижу, что пользователь уже вставлен. Это похоже на режим флеша, и транзакция не работает. Где я иду не так?Откат NHibernate, похоже, не работает

using (var session = sessionFactory.OpenSession()) 
{ 
    session.FlushMode = FlushMode.Never; 

    using (var tran = session.BeginTransaction()) 
    { 
     var user = CreateUser(); 

     session.SaveOrUpdate(user); 

     tran.Rollback(); 
    } 
} 
+0

Не претендовать на откат, чтобы быть сломанным, когда, согласно вашему описанию, вы еще не выполнили откат. –

ответ

1

Если мы проверяем «только после того, как SaveOrUpdate» ... мы все еще внутри одной транзакции. До окончательного решения (фиксация или откат) может произойти множество вещей.

И одна из операции будет решить, если объект должен быть Created или Updated. Поэтому в случае, если генератор ID установлен в native/identity (например, SQL-сервер), NHibernate должен выполнить INSERT, чтобы получить идентификатор. Лот операции можно отложить, но для получения ID - нет возможности подождать.

Так что, скорее всего, ваш идентификатор должен быть получен из БД .. и вот почему INSERT происходит. BUT другие вещи не будут записаны в БД до тех пор, пока не назовутся Flush() ... Итак, я бы не отметил описанное поведение как нечто особенное.

+0

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

Смежные вопросы