Lock, Lock ottimisti e lock pessimisti (Optimistic Lock and Pessimistic Lock)

domenica 13 maggio 2007 alle 13:41 | Pubblicato su Diario, Performance Tuning, SQL | 1 commento

Voglio riportare una sezione del libro di Thomas Kyte in cui parla della gestione dei lock in Oracle. Il problema dei lock nella mia professione ricorre con una certa regolarità, per cui capire meglio come funzionano non è tempo perso.

Prima però di andare nei dettagli della gestione dei lock in Oracle mi è però venuta voglia di scrivere qualcosa sui lock con politica ottimista e con politica pessimista, perchè ancora faccio fatica a fare miei tali concetti.

“Lost Updates”

Per parlare di lock con politica ottimista e lock con politica pessimista bisogna prima spiegare cosa sono i “lost updates” (o “udpate perduti”). Si tratta di una conseguenza indesiderata della combinazione di politiche di lock con l’aggiornamento concorrente degli stessi dati da più utenti sul database. Facciamo un esempio concreto: Un sistema di prenotazione di voli, abbiamo una tabellina con i posti dell’aereo e un campo (chiamiamolo NOMEPRENOTAZIONE) che indica il nome della persona che ha fatto la prenotazione, se il campo è vuoto il posto è libero (non credo che un sistema di prenotazione si implementi così, ma l’esempio mi sembra spiegare bene il problema degli “update perduti”).

Abbiamo due operatori, A e B, che visualizzano la lista dei posti, l’operatore A decide di prenotare per la persona Alfa il posto X, quindi inserisce al terminale il nome Alfa per il posto X e lancia l’OK. Contemporaneamente, o quasi (diciamo una frazione di secondo dopo), l’operatore B prenota il posto X per la persona Beta. Al database arrivano in sequenza due update sullo stesso record, il primo update setta il campo NOMEPRENOTAZIONE al valore ‘Alfa’, il secondo setta il campo NOMEPRENOTAZIONE al valore ‘Beta’. Il secondo che arriva “vince”, cioè il posto risulterà prenotato per Beta e la prenotazione di Alfa è andata perduta senza che l’operatore se ne accorga, questo è il lost update o aggiornamento perduto.

Implementare una politica di lock ottimista o pessimista serve a impedire la casistica dell’aggiornamento perduto.

Lock Pessimista

Un lock pessimista si applica quando si è pessimisti sul fatto che qualcun’altro cercherà di aggiornare lo stesso record che si vuole aggiornare, allora si blocca il record prima di leggerlo. In questo modo, nel nostro esempio, se vediamo che il posto è libero, nessun’altro potra prenotarlo finchè noi non lo sblocchiamo, e se noi lo prenotiamo sarà nostro (è ovvio che tutti devono usare questa politica, perchè altrimenti il trucco non funziona).

Lock Ottimista

In questo caso invece si è ottimisti, quindi non si blocca il record se non al momento della decisione di prenotare, però per evitare il fenomeno del “lost update” bisogna fare qualcosa. Il metodo più generale è quello di aggiungere fra le condizioni di where dell’update oltre alla chiave primaria, il campo che si sta aggiornando con il valore che si è “visto”, cioè nel nostro caso imponiamo anche la condizione che il campo NOMEPRENOTAZIONE sia vuoto; se qualcun’altro ci ha soffiato la prenotazione, la nostra prenotazione fallirà o meglio l’update aggiornerà zero record. Questo caso può essere frustrante per l’operatore, ma è sempre meglio del “lost update”.

Vantaggi e svantaggi

La politica di lock pessimista è indubbiamente la più sicura, ma inibisce la concorrenza, quindi se gli operatori sono tanti ci sono problemi di prestanzioni. La politica ottimista riduce il tempo di lock dei record, quindi favorisce la scalabilità, ovvero le prestazioni in caso di alta concorrenza. Di contro però può generare frustrazione e fastidio negli operatori che devono magari fare la stessa operazione più volte perchè si vedono soffiare sotto gli occhi le prenotazioni.

1 commento »

RSS feed for comments on this post. TrackBack URI

  1. Grazie, una lettura molto utile.
    Ciao


Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

Blog su WordPress.com.
Entries e commenti feeds.

%d blogger cliccano Mi Piace per questo: