2013-05-31 6 views
6

Meine Frage ist im Zusammenhang von nhibernate Transaktionen verwendenNhibernate session.BeginTransaction() vs. transaction.begin()

Ist die transaction.Begin() unter einem Problem? oder einfach nur überflüssig?

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

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

+0

Lese Ayende ist immer gut ... aber in diesem Fall nicht beantwortet meine Frage – SteveM

Antwort

8

Nach Überprüfung der Quelle ist transaction.Begin() in der Tat redundant - ein harmloser No-Op.

link to source

3

beginTransaction wie es heißt, beginnt eine Transaktion,

auf der anderen Seite

session.Transaction wird die aktuelle aktive Transaktion zurück, wenn null erstellen wird.

Die NHibernate-Sitzung verfolgt die aktuelle aktive (nicht festgeschriebene oder rückgängig gemachte) Transaktion.

Wenn Sie ISession.Transaction aufrufen, wenn keine Transaktion wurde noch noch während der Lebenszeit der Sitzung erstellt, wird die Sitzung ein Objekt neue Transaktion zu diesem Zeitpunkt erstellen, wird aber es noch nicht beginnen. Wenn Sie ISession.BeginTransaction aufrufen, wird die Sitzung angezeigt, wenn sie bereits ein Transaktionsobjekt ist, das zuvor erstellt wurde, , aber noch nicht abgeschlossen. Wenn dies der Fall ist, wird dieses Transaktionsobjekt zurückgegeben. Wenn nicht, erstellt es ein neues Transaktionsobjekt, beginnt es und speichert einen Verweis auf dieses neue Objekt.

Nach Abschluss der Transaktion benachrichtigt das Transaktionsobjekt die Sitzung , zu der es gehört, dass es abgeschlossen ist, worauf die Sitzung ihren Verweis auf das Transaktionsobjekt freigibt. Jeder folgende Aufruf an ISession.Transaction oder ISession.BeginTransaction wird dann die Erstellung eines neuen Transaktionsobjekts verursachen.

NHibernate unterstützen keine Wiederverwendung von Transaktion für mehr als ein Transaktionsobjekt (dieses Verhalten von Hibernate verschieden sein kann, die scheint Wiederverwendung von Transaktion zu unterstützen Objekte).

Siehe Dokument this Dokument.

+0

Ein wenig verwirrend ... so beginTransaction erstellt nur eine neue Transaktion, wenn keine aktuelle Transaktion in der Sitzung, sonst gibt die vorhandene zurück? Welchen Effekt hat die nachfolgende Transaktion.Begin() in diesem Fall? Ist es ein No-Op? – SteveM

Verwandte Themen