2009-06-17 3 views
5

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

Например, это означает, что свойство Session.Transaction.WasRolledBack мало помогает, если я не храню ссылку на первую транзакцию и не проверяю ее свойство.

Может ли кто-нибудь дать вам некоторое представление?

int transId = session.Transaction.GetHashCode(); 

using (var tx = session.BeginTransaction()) 
{ 
    Assert.AreEqual(transId, tx.GetHashCode()); 

    tx.Rollback(); 

    Assert.AreEqual(transId, tx.GetHashCode()); 
    Assert.AreEqual(transId, session.Transaction.GetHashCode()); // Fails 
} 

Update: ответ

Дэвида Walschots' является очень полезным и точным. Кроме того, я нашел следующее в Nhibernate Documentation:

Если вы откатить транзакцию вы должны немедленно закрыть и отменить текущую сессию, чтобы гарантировать, что внутреннее состояние NHibernate последовательно «

ответ

6

От NHibernate в действии. (Kuaté, Harris, Bauer, King):

«После совершения транзакции сеанс NHibernate заменяет его новой транзакцией. Это означает, что вы должны хранить ссылку на транзакцию, которую вы совершаете, если считаете, что вам это понадобится впоследствии. Это необходимо, если вам нужно вызвать транзакцию. WasCommited. session.Transaction.WasCommitted всегда возвращает false. "

Скорее всего то же самое относится к свойству Transaction.WasRolledBack.

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