Garantire la Durabilità di una transazione

Per poter garantire le proprietà di atomicità e durabilità di una transazione e necessario garantire che gli effetti di una transazione sopravvivano a un crash del sistema:

I crash del sistema si dividono in 3 tipologie:

  • transaction failures transazioni fallite
  • media failures fallimento del supporto fisico (disco)
  • system crashes crash del sistema (ram a tappo, crash applicativi)

si presume che la scrittura di una pagina su disco sia un operazione atomica

Politiche di gestione del buffer

Data una transazione che modifica una pagina il DBMS ha due possibilità per la gestione della stessa

  • no steal le pagine modificate vengono scritte solo dopo che una transazione è terminata con successo
  • steal le pagine vengono scritte quando è più opportuno con l’obbiettivo di ottimizzare l’ I/O

la politica di steal e quella prediletta da DB2

Commit di una transazione

Anche nel caso in cui una transazione esegua il commit il DBMS ha due politiche di gestione principale

  • force tutte le pagine sono scritte sul disco prima di considerare la transazione terminata
  • no force la formalizzazione della terminazione di una transazione non attende la scrittura delle pagine

la politica di no force e quella prediletta da DB2

Gestione dei crash

Gli strumenti messi in campo dal DBMS per gestire i crash sono essenzialmente 2

Database DumpLog file
Viene effettuato un dump del DB periodico salvato su altro storagefile sequenziale dove vengono scritte le azioni di modifica dei dati

neanche a dirlo che il backup e fondamentale …

Log

raccoglie informazioni riguardanti le operazioni eseguite dalle transazioni, viene scritta una entry nel log nei seguenti casi:

  • update aggiornamento di un record
  • commit successo di una transazione
  • abort fallimento di una transazione
  • end terminazione di una transazione successiva a un commit/abort
  • compensation recupero dello stato di una pagina già scritta su disco da parte di una transazione fallita

Record di update

Il record di update per una transazione di una pagina e formato dai seguenti campi

LSN(Log sequence number)prevLSNTtypePIDbefore(P)after(P)
id univoco del record
indice del’ record di log precedente che riguarda id della transazionetipo del record (in questo caso update)PID della pagina modificataimmagine di P prima della modificaimmagine di P dopo la modifica

Record di compensation

Nel momento in cui le modifiche registrate in un record di update vengono eliminate viene creato un record di compensazione fatto come segue

LSN(Log sequence number)prevLSNTtypePIDbefore(P)undoNextLSN
id univoco del record
indice del’ record di log precedente che riguarda id della transazionetipo del record (in questo caso update)PID della pagina modificataimmagine di P prima della modificaid del prossimo record da annullare, per esempio se si annulla il record allora

Quando scrivere nel log: protocollo WAL

Per far si che il log risulti efficace il DBMS per ogni operazione deve scrivere sul log PRIMA di salvare le modifiche di una pagina sul disco (write-ahead logging)

La responsabilità di garantire il WAL e affidata al buffer manager

image.png

Log e gestione dei fallimenti delle transazioni

Grazie al log e possibile gestire i fallimenti di una transazione anche con politica steal, e sufficiente ripercorrere il log all’indietro e annullare tutte le operazioni di update della transazione

Log e gestione dei fallimenti di sistema

In caso di fallimento di sistema tutte le transazioni che non hanno scritto nel log il record di commit vanno annullate, inoltre se si applica la politica di no force e possibile che alcune pagine di una transazione committata non siano state scritte nel disco, e necessario dunque rifare queste transazioni

Evitare di riscrivere pagine già scritte

Per evitare di riscrivere tutti i parametri delle pagine di una transazione da rifare si adotta il seguente approccio

flowchart LR
subgraph page update
A[update di P]
B[creazione del log <br/>di update di P]
C[salvataggio di **LSN** <br/>nel header di P]
A --> B--> C
end
subgraph page re-done
D{se LSN P > <br/>LSN record di log}
E[pagina non riscritta]
F[pagina riscritta]
D -- si --> E
D -- no --> F
end

Record di Checkpoint

Per ottimizzare la procedura di restore da un fallimento di sistema si introduce nel log un record di checkpoint periodicamente, dove vengono inserite la tabella delle dirty pages e la tabella delle transazioni

in questo modo set e stata committata prima del record di checkpoint non deve essere rifatta

Algoritmo ARIES e gestione della recovery

L’algoritmo di ARIES consente l’utilizzo di politiche di steal e no force, si divide in 3 fasi principali

  • analisi viene determinato un insieme di pagine e transazioni attive al momento del crash
  • redo ripete tutte le azioni a partire da un dato punto del log
  • undo annulla tutte le azioni svolte da transazioni abortite

Fase di analisi

Nella fase di analisi l’obbiettivo e quello di ripristinare lo stato delle pagine e della tabella delle transazioni al momento del crash, si procede come segue:

---
title: analysis phase
---
flowchart TD
A[si recupera l'ultimo record di checkpoint dal log]
B[si recupera la tabella delle pagine e delle transazioni attive e si percorre il log in avanti]
C{record <br/>ABORT/COMMIT}
D[si rimuove la transazione dalla tabella delle attive]
E{record <br/>BEGIN}
F[si aggiunge la transazione alla tabella delle attive]
G{record <br/>UPDATE/COMPENSATION}
H[si aggiunge la pagina alla tabella delle pagine sporche]
A --> B --> C & E & G
C --> D
E --> F
G --> H

Fase di redo

Nella fase di redo si svolgono tutte le modifiche alle pagine effettuate prima del crash

flowchart TD
A[si identifica il record con LSN minore tra quello delle pagine sporche ovvero la pagina che e stata modificata per prima]
B[si ripercorre il log in avanti considerando i record di UPDATE/COMPENSATION]
C{se LSN della pagina < LSN record <br/> pagina e sporca}
D[si ripete la modifica del record]
E[si aggiorna LSN della pagina]
A --> B --> C --> D --> E

Fase di undo

In questa fase tutte le transazioni attive al momento del crash vengono annullate

flowchart TD
A[si identificano le transazioni attive al momento del crash]
B[partendo da quella con LSN piu alto si percorre il log all'indetro]
C{COMPENSATION RECORD con undoNextLSN != 0}
D[si procede al prossimo record della transazione indicato da undoNextLSN]
E{UPDATE RECORD}
F[si annulla il record e si scrive un record di compensazione, si procede al prevLSN record]
A --> B --> C & E
C --> D
E --> F

scrivere compensation record nella fase di undo semplifica la procedura in caso di guasti ripetuti, dato che si e in grado di comprendere alla prossima esecuzione della procedura che le modifiche alle pagine sono già state apportate

PREVIOUS NEXT