Spesso in molte applicazioni si ha la necessità di dover gestire la concorrenza su contenuti presenti nelle nostre applicazioni, più o meno complesse che esse siano.
Questa procedura a volte può essere molto dispendiosa in termini di tempi di sviluppo, in quanto ad ogni salvataggio dobbiamo verificare che non siano state effettuate operazioni su quel record nel periodo intercorso dal recupero del record, la sua modifica ed il successivo salvataggio.
Per la gestione della concorrenza si possono utilizzare due metodologie entrambe valide ed entrambe semplici. ma con un approccio a livello di query su database piuttosto differente.
La prima consiste nell'utilizzare un campo per ogni tabella del database, dove andremo a memorizzare la versione attuale del record ed al momento del salvataggio verrà verificato che questo valore non è cambiato nell'arco di tempo interessato dalle nostre operazioni.
Il secondo approccio consiste nel verificare il singolo valore di ogni campo della tabella e, nel caso nessuno di essi sia variato, si procede con l'update.
Come si può ben immaginare, le performance delle due procedure sono ben diverse specie se la tabella ha un gran numero di campi, ma in molte applicazione non si ha la possibilità di aggiungere una colonna ad una tabella per memorizzare la versione e l'unica soluzione è verificare valore valore nella query di inserimento.
Ovviamente grazie a NHibernate non ci dobbiamo preoccupare di realizzare query e di passare parametri, ma soltanto di realizzare correttamente il file di mapping come mostrato dallo script seguente:
private int iD = 0; private string title = string.Empty; private string description = string.Empty; private int version = 0; public int ID { get { return iD; } set { iD = value; } } public string Title { get { return title; } set { title = value; } } public string Description { get { return description; } set { description = value; } } public int Version { get { return version; } set { version = value; } } <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false" assembly="OptimisticLock" namespace="OptimisticLock.Entity" default-access="field.camelcase"> <class name="News" table="News" > <id column="ID" name="ID"> <generator class="native" /> </id> <version column="Version" name="Version" /> <property name="Title" column="Title" /> <property name="Description" column="Description" /> </class> </hibernate-mapping>
Nel caso si ha la necessità di verificare ogni singola voce al momento dell'update, basta aggiungere gli attributi optimistic-lock="dirty" e dynamic-update="true" al tag class e rimuovere il tag version.
Come potete vedere implementare una gestione sulla concorrenza tramite NHibernate diventa pittusto semplice, riducendo drasticamente i tempi di sviluppo delle nostre applicazioni.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.