lock

Il lock è il privilegio di accesso ad un singolo item, realizzato tramite una variabile associata all’item (variabile lucchetto), il cui valore descrive lo stato dell’item rispetto alle operazioni che possono essere effettuate su di esso.

(nella sua forma più semplice) un lock:

  • viene richiesto da una transazione (locking) - se il valore è unlocked, la transazione può accedere all’item e alla variabile viene assegnato il valore locked
  • viene rilasciato da una transazione (unlocking) - assegna alla variabile il valore unlocked

quindi

  • tra l’esecuzione di un’operazione di locking su un item e un’operazione di unlocking sullo stesso item, si dice che la transazione mantiene un lock sull’item
  • il locking agisce come primitiva di sincronizzazione (se una transazione richiede un lock su un item su cui un’altra transazione mantiene un lock, non può passare finché il lock non viene rilasciato).

schedule legale

Uno schedule è detto legale se:

  • una transazione effettua un locking ogni volta che deve leggere o scrivere un item
  • ciascuna transazione rilascia ogni lock che ha ottenuto

lock binario

Un lock binario può assumere solo due valori: locked e unlocked.

Le transazioni fanno uso di due operazioni:

  • lock(X) per richiedere accesso all’itemX
  • unlock(X) per rilasciare l’item X

vantaggi

Attraverso il lock binario risolviamo il primo dei problemi visti: la perdita di aggiornamento (ghost/lost update).

equivalenza, serializzabilità

La proprietà di equivalenza degli schedule dipende dal protocollo di locking adottato - vediamo il caso del locking binario.

  • serve adottare un modello di transazioni che si astragga dalle specifiche operazioni e si basi su quelle rilevanti, per valutare le sequenze degli accessi (lock e unlock)

Una transazione viene quindi interpretata come sequenza di lock e unlock:

  • ogni lock(X) implica la lettura di X
  • ogni unlock(X) implica la scrittura di X

(tutto quello che succede in mezzo non ci interessa)

center

  • in corrispondenza di una scrittura, viene associato un nuovo valore all’item coinvolto, calcolato da una funzione, associata in modo univoco ad una coppia lock-unlock
    • questa fuzione ha per argomenti tutti gli item letti prima dell’unlock corrente, con il valore che avevano quando sono stati letti.

equivalenza

Due schedule si definiscono quindi equivalenti se le formule che danno i valori finali per ciascun item sono le stesse.

serializzabilità

Uno schedule è serializzabile se è equivalente ad uno schedule seriale (come già visto)

  • basta quindi che le formule siano diverse anche su un solo item perché gli schedule non siano equivalenti
    • quindi, per provare che uno schedule non è serializzabile, basta fermarsi appena troviamo un item che ha formule diverse

testare la serializzabilità

Uno schedule è serializzabile se esiste uno schedule seriale tale che per ogni item, l’ordine in cui le varie transazioni fanno un lock coincide con quello dello schedule seriale.

Esiste un algoritmo per testarla:

passo 1

  • creare un grafo diretto formato da:
    • nodi: transazioni
    • archi: (con etichetta ) se esegue un unlock(X) e esegue il SUCCESSIVO lock(X)

center

passo 2

  • se ha un ciclo, allora non è serializzabile
  • altrimenti, applicando l’ordinamento topologico, si ottiene uno schedule seriale equivalente a (l’ordine di cancellazione dei nodi corrisponde allo schedule seriale)

ordinamento topologico

Si ottiene eliminando ricorsivamente un nodo che non ha archi entranti (e i suoi archi uscenti).

  • c’è più di un ordinamento topologico (ci sono diversi path che posso prendere, in base a quale nodo senza archi entranti decido di eliminare per primo)

center

teorema: correttezza dell'algoritmo

Uno schedule è serializzabile se e solo se il suo grafo di serializzazione è aciclico.

locking a due fasi

Una transazione obbedisce al protocollo di locking a due fasi se:

  • prima effettua tutte le operazioni di lock - fase di locking
  • poi tutte le operazioni di unlock - fase di unlocking

serializzabilità

teorema

Sia un insieme di transazioni. Se ogni transazione in è a due fasi, allora ogni schedule di è serializzabile

dimostrazione

Per assurdo, ogni transazione in è a due fasi, ma nel grafo di serializzazione c’è un ciclo.

center

Entriamo subito in una contraddizione: infatti, il ciclo si chiude solo nel caso una transizione abbia fatto un unlock e, subito dopo, un lock. Ma questo non è possibile se ogni transazione è a due fasi ( ha già chiesto i suoi lock). Ovvero, due fasi ogni schedule serializzabile

vantaggi

Il lock a due fasi risolve il problema dell’aggregato non corretto (una transazione non ha accesso ai dati locked di fino a quando essa non li rilascia, e legge prima tutti i dati di cui ha bisogno, e poi li usa)

domande orale

possibili domande orale

  • cos’è un lock?
  • quando uno schedule si dice legale?
  • come funziona il lock binario?
  • quando uno schedule che usa lock binario è serializzabile?
  • come si testa la serializzabilità? (nel caso di lock binario)
  • cosa risolve il lock binario?
  • cos’è il locking a due fasi?
  • dimostrazione due fasi serializzabile
  • cosa risolve il locking a due fasi?