2010-07-21 10 views
14

Sé que para escrituras multiparte, debería estar usando transacciones en nhibernate. Sin embargo, para lecturas y escrituras simples (1 parte) ... He leído que es una buena práctica usar siempre las transacciones. Es esto requerido?¿Debo usar siempre transacciones en nhibernate (incluso para lecturas y escrituras simples)?

¿Debo hacer lo siguiente para una lectura simple? ¿o puedo simplemente dejar caer la parte de transcacción a togather?

public PrinterJob RetrievePrinterJobById(Guid id) 
{ 
    using (ISession session = sessionFactory.OpenSession()) 
    { 
     using (ITransaction transaction = session.BeginTransaction()) 
     { 
      var printerJob2 = (PrinterJob) session.Get(typeof (PrinterJob), id); 
      transaction.Commit(); 

      return printerJob2; 
     } 
    } 
} 

o

public PrinterJob RetrievePrinterJobById(Guid id) 
{ 
    using (ISession session = sessionFactory.OpenSession()) 
    { 
     return (PrinterJob) session.Get(typeof (PrinterJob), id);    
    } 
} 

¿Y para las escrituras simples?

public void AddPrintJob(PrinterJob printerJob) 
{ 
    using (ISession session = sessionFactory.OpenSession()) 
    { 
     using (ITransaction transaction = session.BeginTransaction()) 
     { 
      session.Save(printerJob); 
      transaction.Commit(); 
     } 
    } 
} 
+7

Excelente respuesta en SO: http://stackoverflow.com/questions/1657465/nhibernate-transactions-on-reads –

Respuesta

21

La mejor recomendación sería usar siempre una transacción. This link from the NHProf documentación, mejor explica por qué.

Cuando no definimos nuestros propios transacciones, cae de nuevo en modo de transacción implícita, donde cada comunicado a la base de datos se ejecuta en su propia transacción , lo que resulta en un gran costo de rendimiento (tiempo de la base de datos a crear y deshacer transacciones) y consistencia reducida.

Incluso si sólo estamos leyendo datos, debe utilizar una transacción, porque utilizando transacciones asegura que obtenemos resultados consistentes de la base de datos. NHibernate asume que todo el acceso a la base de datos se realiza en una transacción , y desaconseja encarecidamente cualquier uso de la sesión sin una transacción .

(Por cierto, si está realizando un trabajo serio de NHibernate, considere probar NHProf).

Cuestiones relacionadas