Two Phase Locking

Da Wikipedia, l'enciclopedia libera.

Il two phase locking (2PL) è un protocollo per il controllo della concorrenza utilizzato nel campo dei database per garantire la serializzabilità di uno schedule di transazioni.

Questo protocollo assume che ogni transazione in esecuzione preveda due fasi principali:

  • nella prima fase tutti i lock sulle risose necessarie all'esecuzione dell'intera transazione vengono acquisiti;
  • nella seconda vengono tutti rilasciati senza possibilità di acquisirne dei nuovi fino alla fine della transazione.

Se tutte le transazioni rispettano il 2PL allora (si dimostra formalmente) uno schedule 2PL è conflict serializzabile. Il 2PL garantisce l'assenza di Deadlock in un sistema NON distribuito.

Richieste di Lock[modifica | modifica wikitesto]

Una transazione gestita con il Two Phase Locking può richiedere diverse operazioni al gestore della concorrenza:

  • R-LOCK: richiesta per il blocco di una risorsa in sola lettura. Questo tipo di lock è condiviso quindi più di una transazione contemporaneamente può fare la stessa richiesta di lock sulla stessa risorsa;
  • W-LOCK: richiesta per il blocco di una risorsa in scrittura. Questo tipo di blocco è esclusivo quindi nessun'altra transazione può usare la risorsa finche è bloccata con questo tipo di lock;
  • UNLOCK: richiesta per il rilascio di un blocco su una risorsa.

Le richieste di lock sono inviate dalle transazioni al gestore della concorrenza il quale in base allo stato della risorsa interessata valuta se concedere il lock oppure far aspettare la transazione. Questa scelta è fatta consultando la seguente tabella:

FREE R-LOCK W-LOCK
R-LOCK Sì/R-LOCK Sì/R-LOCK ggNO/W-LOCK
W-LOCK Sì/W-LOCK NO/R-LOCK NO/W-LOCK
UNLOCK NO/FREE Sì/FREE* Sì/FREE

Questa tabella mostra sulla prima colonna le richieste possibili delle transazioni, sulla prima riga i possibili stati di una risorsa e all'interno delle caselle se la richiesta è stata accettata dal gestore della concorrenza e il rispettivo stato successivo della risorsa.

Nel caso in cui la risorsa sia nello stato di R-LOCK e la transazione richieda un UNLOCK la risorsa diventa libera solo se non c'erano altre R-LOCK che la tenevano bloccata, infatti lo stato di R-LOCK è condiviso quindi più di una transazione può richiederolo e la risorsa diventa effettivamente libera solo quando tutte le risorse che la bloccavano in lettura la liberano.

Esempio di transazioni concorrenti con il 2PL[modifica | modifica wikitesto]

Di seguito due transazioni che rispettano il 2PL:

T1 T2
lock(p1)
read(p1)
lock(p1)
write(p1)
lock(p2)
unlock(p1)
read(p1)
write(p1)
lock(p2)
unlock(p1)
read(p2)
write(p2)
unlock(p2)
read(p2)
write(p2)
unlock(p2)

Come si può vedere dalla tabella, sia in T1 che in T2 i lock e gli unlock sono acquisiti e rilasciati secondo il 2PL.

Collegamenti esterni[modifica | modifica wikitesto]