2009-06-17 6 views
5

Mam następujący kod (uproszczony ze względu na dyskusję). Nie rozumiem, dlaczego właściwość session.Transaction zwraca inną transakcję po wycofaniu.Session.Transaction zmiany po Cofaniu (NHibernate)

Na przykład oznacza to, że właściwość Session.Transaction.WasRolledBack jest mało przydatna, o ile nie przechowuję odniesienia do pierwszej transakcji i nie sprawdzam jej właściwości.

Czy ktoś może wnieść tu pewien wgląd?

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: Odpowiedź

Davida Walschots' jest bardzo pomocny i precyzyjne. Również znalazłem następujące w Nhibernate Documentation:

Jeśli wycofać transakcję należy niezwłocznie zamknąć i usunąć bieżącą sesję, aby upewnić się, że stan wewnętrzny NHibernate jest spójna „

Odpowiedz

6

Od NHibernate w działaniu. (Kuaté, Harris, Bauer, King):

"Po przeprowadzeniu transakcji sesja NHibernate zastępuje ją nową transakcją. Oznacza to, że powinieneś zachować odniesienie do transakcji, którą popełniasz, jeśli uważasz, że będziesz jej później potrzebować. Jest to konieczne, jeśli chcesz zadzwonić do transakcji.WasCommited. session.Transaction.WasCommitted zawsze zwraca wartość false. "

Najprawdopodobniej to samo dotyczy właściwości Transaction.WasRolledBack:

Powiązane problemy