mercoledì 25 agosto 2010

NHibernate - Gestione della concorrenza

C# 2.0

In alcune applicazioni c’è la necessità di gestire un corretto accesso ai dati, evitando eventuali problemi di concorrenza. Tipico esempio potrebbe essere quello delle gestione degli ordini, dove due utenti stanno lavorando contemporaneamente sullo stesso ordine e non si vuole rischiare di sovrascrivere informazioni dell’uno o dell’altro operatore.


Con NHibernate quindi è abbastanza semplice gestire tale esigenza, agendo nel seguente modo:

1. Aggiungere nella tabella degli ordini il campo DataUpdate di tipo datetime.

2. Modificare il file di mapping della tabella interessata, aggiungendo l’elemento timestamp subito dopo quello dell’identificativo della tabella, ed è importante che sia in questa posizione, prima della definizione delle altre proprietà affinché tutto funzioni correttamente.



<id name="Id" type="Guid">

<column name="Id" length="16" sql-type="uniqueidentifier" not-null="true" unique="true" index="PK_Ordine"/>

<generator class="guid" />

</id>

<timestamp column ="DataUpdate" name ="DataUpdate"/>

<property name="IdAssegnazione" type="Guid">

<column name="IdAssegnazione" length="16" sql-type="uniqueidentifier" not-null="false"/>

</property>



3. Gestire l’eccezione di tipo StaleObjectStateException nel metodo di aggiornamento dei dati.

try

{

using (ISession s = SessionController.Instance.NHSession)

{

s.SaveOrUpdate(ordine);

s.Flush();



}

}

}

}

catch (NHibernate.StaleObjectStateException ex)

{

MessageBox.Show("Attenzione! L’ordine è già stato modificato da un altro utente.\rControllare il file di Log. ", "Gestione Ordini", MessageBoxButtons.OK, MessageBoxIcon.Warning);



// Eventuale scrittura su file di log



}

catch (Exception ex)

{



}

finally

{



}