deadlock
Un deadlock si verifica quando:
- ogni transazione in un insieme è in attesa di ottenere un lock su un item sul quale qualche altra transazione dell’insieme detiene un lock,
- quindi ogni transazione rimane bloccata, non rilascia i propri lock, e può bloccare anche transazioni che non sono in
grafo d'attesa
Per verificare il sussistere di una situazione di stallo, si mantiene il grafo d’attesa, che ha come
- nodi: le transazioni
- archi: c’è un arco quando la transazione è in attesa di ottenere un lock su un item su cui mantiene un lock
soluzioni risolutive
roll-back
Per risolvere il sussistere di una situazione di stallo, una transazione nel ciclo viene rolled-back e successivamente fatta ripartire.
- la transazione è abortita
- i suoi effetti sulla base di dati vengono annullati, ripristinando i valori dei dati precedenti all’inizio della sua esecuzione
- tutti i lock mantenuti dalla transazione vengono rilasciati
approcci preventivi
In genere, si cerca di evitare il verificarsi di situazioni di stallo adottando opportuni protocolli.
Per esempio, si possono ordinare gli item e imporre alle transazioni di richiedere i lock necessari seguendo tale ordine.
- così non ci possono essere cicli nel grafo di attesa
livelock
Un livelock si verifica quando una transazione aspetta indefinitamente che gli venga garantito un lock su un certo item.
Il problema dell’attesa indefinita può essere risolto:
- con una strategia first come-first served
- eseguendo le transazioni in base alla loro priorità e aumentando la priorità di una transazione all’aumentare del tempo in cui rimane in attesa
abort di una transazione
Avviene quando:
- la transazione esegue un’operazione non corretta (es. divisione per 0)
- lo scheduler rileva un deadlock
- lo scheduler fa abortire la transazione per garantire la serializzabilità
- si verifica un malfunzionamento hardware o software
punto di commit
Il punto di commit di una transazione è il punto in cui essa ha ottenuto tutti i lock di cui aveva bisogno, e ha effettuato tutti i calcoli (quindi sta per fare gli unlock). In questo caso, non può essere abortita se non per il punto 4).
dati sporchi
I dati sporchi sono quindi i dati scritti da una transazione sulla base di dati prima di raggiungere un punto di commit
rollback a cascata
Quando una transazione viene abortita, devono essere annullati gli effetti sulla base di dati prodotti sia da che da qualsiasi transazione abbia letto dati sporchi.
Abbiamo visto che:
- il lock binario permette di risolvere il problema del lost update, ma non quello della lettura di un dato sporco o dell’aggregato non corretto.
- il locking a due fasi permette di risolvere il problema dell’aggregato non corretto, ma non quello della lettura del dato sporco
Per risolvere questo problema, quindi, serve che le transazioni obbediscano a regole più restrittive.
locking a due fasi stretto
Una transazione soddisfa il protocollo di locking a due fasi stretto se:
- non scrive sulla base di dati fino a quando non ha raggiunto il suo punto di commit
- questo assicura che, se una transazione viene abortita, non ha modificato nessun item nella base di dati
- non rilascia un lock finché non ha finito di scrivere sulla base di dati
- in questo modo, se una transazione legge un item scritto da un’altra transazione, quest’ultima sarà sicuramente una transazione che non può essere abortita
esempio
protocolli: classificazione
protocolli conservativi
I protocolli conservativi cercano di evitare le situazioni di stallo. Ogni transazione richiede tutti i lock all’inizio - se ne manca anche uno solo, la transazione viene messa in attesa. (se ha ricevuto lock, questi vengono rilasciati)
Così si evita il deadlock, ma non il livelock - la transazione rischia di non poter mai partire. Per evitare anche il livelock, una transazione richiede tutti i lock che servono all’inizio e li ottiene se e solo se:
- tutti i lock sono disponibili
- nessuna transazione che precede T nella coda è in attesa di un lock richiesto da T
vantaggi e svantaggi
vantaggi:
- si evita il verificarsi sia del deadlock che del livelock
svantaggi:
- l’esecuzione di una transizione può essere ritardata.
- una transizione è costretta a richiedere un lock su ogni item che potrebbe servirle, anche se poi non lo utilizza.
protocolli aggressivi
I protocolli aggressivi cercano di processare le transazioni il più rapidamente possibile anche se ciò può portare a situazioni di stallo.
Una transazione deve richiedere un lock su un item immediatamente prima di leggerlo o scriverlo.
- può verificarsi deadlock
a confronto
La scelta tra protocolli conservativi e aggressivi si basa principalmente sulla probabilità che due transazioni richiedano un lock su uno stesso item. Se essa è
- alta ⇒ conviene un protocollo conservativo, che evita il sovraccarico dovuto alla gestione del deadlock (rilevarlo, risolvere lo stallo, eseguire parzialmente transazioni che poi verranno abortite, rilascio dei lock)
- bassa ⇒ conviene un protocollo aggressivo, che evita il sovraccarico dovuto alla gestione dei lock (decidere se garantire un lock, gestire la tavola dei lock, mettere e togliere transazioni da una coda)
domande orale
possibili domande orale
- quando si verifica un deadlock? e un livelock?
- come si verifica il sussistere di una situazione di stallo?
- quali sono le soluzioni risolutive e gli approcci preventivi per il deadlock?
- come si risolve il livelock?
- quando avviene l’abort di una transazione?
- come funziona il locking a due fasi stretto?
- cosa risolve il locking a due fasi stretto?
- protocolli conservativi e aggressivi