Indietro

ⓘ Dirty read




Dirty read
                                     

ⓘ Dirty read

In informatica con il termine dirty read, o uncommitted dependency, si intende un errore nella gestione della concorrenza tra transazioni dovuta ad una dipendenza write → read.

Il dirty read è una perdita di modifiche in una base di dati causato da una dipendenza di una transazione da unaltra non completata con successo con conseguente lettura di dati inconsistenti.

                                     

1. Definizione

Si è in presenza di dirty read quando una transazione Ta legge un dato X con versione 0, denotato come X0, ne produce una nuova versione X1 che viene letta da unaltra transazione Tb, ma X1 non permane al termine dellesecuzione Ta.

                                     

2. Cascading abort

Quando una transazione Ta fallisce, il recovery manager ne elimina gli effetti, in particolare i dati modificati dalla transazione abortita e da tutte le altre transazioni che hanno effettuato dirty read.

In questo caso si verifica una catena di fallimenti di transazioni alterate da Ta noto come cascading abort.

                                     

3. Recoverability

Al fine di ovviare i problemi dei cascading abort si introduce il concetto di Recoverability, ripristinabilità.

Definizione

Una transazione T è Recoverable se le viene impedito di eseguire il commit prima che tutte le transazioni, che scrivono valori letti da T, eseguano commit o abortiscano.

                                     

4. Avoiding Cascading Abort

La recoverability evita di far fallire transazioni che abbiano eseguito il commit. Tuttavia non rimuove il cascading abort per transazioni attive.

Per evitarlo è sufficiente impedire la dirty read ritardando ogni lettura di un dato di cui altre transazioni operino write. La lettura sarà possibile solo al commit delle transazioni scriventi.

                                     

5.1. Esempi Esempio 1

Consideriamo il seguente schema funzionale:

La transazione Tb vede il valore X1 al tempo t2 che di fatto non esiste, in quanto al tempo t3 il valore verrà ripristinato a X0. La lettura eseguita da Tb pertanto non è corretta.

                                     

5.2. Esempi Esempio 2

Il problema del dirty read può presentarsi anche in assenza di rollback:

In questo caso Tb legge il valore X1 che però è inconsistente in quanto la versione finale sarà X2.

                                     

5.3. Esempi Esempio di cascading abort

Poiché Ta subisce il rollback, viene ripristinato il valore X0. Dato che Tb ha eseguito una dirty read, anche le sue operazioni verranno annullate ripristinando il valore Y0.

                                     

5.4. Esempi Esempio di cascading abort con commit di Tb

Il problema nasce nel caso in cui Tb esegua il commit a t5:

In questo caso il recovery manager ha due possibilità operative:

  • Lasciare permanenti i prodotti di Tb, violando però la semantica della read.
  • Annullare gli effetti prodotti da Tb, violando la semantica del commit ed violando la durability Vedi ACID delle committed transaction.
                                     

5.5. Esempi Esempio di Avoiding Cascade Abort

Riportiamo la tabella dellesempio precedente:

Lesecuzione è Recoverable ma non evita Avoiding Cascade Abort. Ritardando la lettura di Xi da parte di Tb viene risolto il problema: