2013-05-31 15 views
6

Moje pytanie jest związane z korzystaniem z transakcji NHibernateNhibernate session.BeginTransaction() vs. transaction.Begin()

Czy transaction.Begin() poniżej problem? lub po prostu zbędne?

using (var transaction = session.BeginTransaction()) 
{ 
    transaction.Begin(); 
    action(); 
    transaction.Commit(); 
} 
+1

Zaznacz to: http://ayende.com/blog/3775/nh-prof-alerts-use-of-implicit-transactions-is-discouraged – Freelancer

+0

Reading Ayende jest zawsze dobra, ale ... w tym przypadku nie odpowiada na moje pytanie – SteveM

Odpowiedz

8

Po sprawdzeniu źródła, transaction.Begin() jest w rzeczywistości zbędny - nieszkodliwa operacja.

link to source

3

beginTransaction jak stwierdza rozpoczyna transakcję,

Natomiast

session.Transaction powróci na bieżący aktywną transakcję jeśli zerowy stworzy jeden.

Sesja NHibernate śledzi bieżącą aktywną transakcję (niezaakceptowaną lub wycofaną ).

Jeśli zadzwonisz ISession.Transaction gdy transakcja nie została jeszcze jeszcze utworzony w czasie życia sesji, sesja będzie utworzyć nowy obiekt transakcji w danym momencie, ale nie zacznie jeszcze. Po wywołaniu ISession.BeginTransaction, sesja zobaczy , jeśli jest już obiektem transakcji, który został wcześniej utworzony, , ale jeszcze nie został ukończony. Jeśli tak, zwróci ten obiekt transakcji. Jeśli nie, utworzy nowy obiekt transakcji, rozpocznie go i zapisze odniesienie dla tego nowego obiektu.

Po zakończeniu transakcji, obiekt transakcji powiadamia sesję , do której należy, że zakończyła sesję, na której sesja zwalnia odniesienie do obiektu transakcji. Każde następne wywołanie do ISession.Transaction lub ISession.BeginTransaction spowoduje następnie utworzenie nowego obiektu transakcji.

NHibernate nie obsługuje ponownego użycia obiektów transakcji dla więcej niż jednej transakcji ( ) (to zachowanie może się różnić od stanu hibernacji, które wydaje się, że obsługuje ponowne użycie obiektów transakcji).

Refer to this document.

+0

Trochę mylące ... tak beginTransaction tworzy tylko nową transakcję, jeśli nie ma bieżącej transakcji w sesji, w przeciwnym razie zwraca istniejącą? Jaki więc skutek ma następująca transakcja.Begin()? Czy to nie jest operacja? – SteveM

Powiązane problemy