2013-05-31 9 views
6

La mia domanda è legata all'uso di transazioni NHibernateNHibernate session.BeginTransaction() vs. transaction.Begin()

è il transaction.Begin() di sotto di un problema? o semplicemente ridondante?

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

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

+0

lettura Ayende è sempre buono, ma ... in questo caso non risponde alla mia domanda – SteveM

risposta

8

Dopo aver controllato la fonte, il numero transaction.Begin() è in realtà ridondante - un innocuo no-op.

link to source

3

beginTransaction quanto stabilisce inizia una transazione,

invece

session.Transaction restituirà la transazione attiva corrente se null creerà uno.

La sessione di NHibernate tiene traccia della transazione attiva corrente (non impegnata o annullata).

Se si chiama ISession.Transaction quando nessuna transazione è stato ancora ancora creato durante la durata della sessione, la sessione sarà creare un nuovo oggetto di transazione a quel punto nel tempo, ma non inizierà ancora. Quando si chiama ISession.BeginTransaction, la sessione vedrà se è già un oggetto transazione che è stato creato in precedenza, ma non ancora completato. In tal caso, restituirà questo oggetto transazione. In caso contrario, creerà un nuovo oggetto di transazione, inizierà e memorizzerà un riferimento a questo nuovo oggetto.

Al completamento della transazione, l'oggetto transazione notifica la sessione a cui appartiene che ha completato, in cui la sessione sarà rilasciare il suo riferimento all'oggetto transazione. Qualsiasi successiva chiamata a ISession.Transaction o ISession.BeginTransaction causerà quindi la creazione di di un nuovo oggetto di transazione.

NHibernate non supporta il riutilizzo di oggetti di transazione per più di una transazione (questo comportamento può essere diverso da Hibernate, che sembra sostenere il riutilizzo delle transazioni di oggetti).

Consultare il documento this.

+0

Un po 'di confusione ... quindi beginTransaction crea solo una nuova transazione se non ci sono transazioni correnti nella sessione, altrimenti restituisce quella esistente? Quindi quale effetto ha la transazione successiva.Begin() in questo caso? È un no-op? – SteveM