2010-12-06 14 views
5
using (var tran = repository.Session.BeginTransaction()) 
{ 
    try 
    { 
     repository.Save(entity); 
     tran.Comit(); 
    } 
    catch(Exception) 
    { 
     tran.Rollback(); 
     throw; 
    }  
} 

using (var tran = repository.Session.BeginTransaction()) 
{ 
    try 
    { 
     repository.GetById(id); 
     tran.Comit(); 
    } 
    catch(Exception) 
    { 
     tran.Rollback(); 
     throw; 
    }  
} 

Cuando intento para conseguir entidad por Id después de excepción y tran.rollback() en primer lugar utilizando ... consigo excepción de actualización. Entonces nhibernate está tratando de actualizar la entidad desde el primer uso en el segundo uso.NHibernate estado de sesión después de 3 rollback()

¿Por qué? Hice la tran.Rollback. ¿Debo hacer Session.Clear() también?

Gracias

Respuesta

14

De acuerdo con la API de Hibernate, cuando una sesión de Hibernate genera una excepción, que debe cerrar la sesión y crear una nueva. Además, cuando revierte una transacción de Hibernate, no debe realizarla más tarde ni vaciar la sesión: usted debe comenzar de nuevo en una nueva sesión.

En particular (y este es un detalle de implementación así que no confíe en él), después de una reversión, la sesión de Hibernate todavía tiene entidades creadas/modificadas desde que comenzó la transacción: Hibernate no pasa por sus entidades y revierte todos los cambios que hiciste Por lo tanto, si revierte la transacción y luego descarga la sesión, Hibernate confirmará los cambios de la entidad que pensó que revertía. Si vas a jugar con fuego tratando de hackear este comportamiento (como al borrar la sesión), ten cuidado. Lo mejor es comenzar de nuevo con una nueva sesión.

+1

Ok, pero mi sesión está gestionada contextualmente por structuremap ioc, y es por llamada wcf. Si elimino la sesión, tendré errores en otra parte. – Luka

+0

¿Qué excepciones estás obteniendo? ¿Puedes tratar de prevenirlos? ¿Puedes publicarlos aquí? – gdj

+0

Estoy obteniendo GenericAdoException, porque estoy tratando de insertar un valor duplicado, que debe ser exclusivo. Pero ese no es el punto. Necesito saber cuál es la mejor práctica. Hasta ahora tengo manejo de excepciones como el anterior. Pero ahora, veo que esto no será suficiente. – Luka

Cuestiones relacionadas