using (var session = sessionFactory.OpenSession())
using (var tx = session.BeginTransaction())
{
    try {
        .....
        session.Update(obj);
        .....

        tx.Commit();
    } catch (Exception ex) {
        tx.Rollback();
        if (ex is StaleStateException)
            throw new DataConcurrencyException("blablabla", ex);
        throw new MyException("blablabla", ex);
    }
}

también podés hacer 2 catch, uno para StaleStateException y otro para
Exception y copiar en ambos la línea del Rollback, a gusto del
consumidor.

Algo que tenes que tener en cuenta es que una vez que una exception es
lanzada desde nh la session deja de ser "estable", por lo que lo mejor
es cerrarla y abrir una nueva (en este código se hace porque después
de la excepción está el dispose, pero si no fuese así te tenés que
asegurar de cerrarla.

saludos
nelo

2011/2/4 Juan Cuello <[email protected]>:
> Hola a todos,
>
> Debido a que estamos desarrollando un proyecto con arquitectura
> desacoplada, nos encontramos con un problema en la gestión de
> concurrencia. El problema es que cuando salta una excepción de
> concurrencia StaleStateException, queremos automatizar que en realidad
> se lance una excepción de nuestro framework.
>
> La idea que he tenido es agregar un listener que herede por ejemplo de
> DefaultUpdateEventListener para hacer lo siguiente:
>
>        protected override object
> PerformSaveOrUpdate(NHibernate.Event.SaveOrUpdateEvent @event)
>        {
>            try
>            {
>                return base.PerformSaveOrUpdate(@event);
>            }
>            catch (StaleStateException ex)
>            {
>                throw new DataConcurrencyException(ex.Message, ex);
>            }
>        }
>
> Para la concurrencia, que sólo saltaría en updates (lógicamente), de
> qué clase debo heredar:  DefaultUpdateEventListener,
> DefaultSaveEventListener, DefaultSaveOrUpdateEventListener,
> DefaultSaveOrUpdateCopyEventListener?????
>
> A alguien se le ocurre una forma mejor de hacer esto?
>
> Muchas gracias
>
> --
> Para escribir al Grupo, hágalo a esta dirección: 
> [email protected]
> Para más, visite: http://groups.google.com/group/NHibernate-Hispano

-- 
Para escribir al Grupo, hágalo a esta dirección: 
[email protected]
Para más, visite: http://groups.google.com/group/NHibernate-Hispano

Responder a