SIF8020 Datamodellering og databasesystemer: Transaksjonsmodell Kapittel 17, Coping With System Failure 20. april 2004, Roger Midtstraum, IDI/ ACID-transaksjoner Atomicity Alt eller ingenting Consistency Fra konsistent db-tilstand til ny konsistent dbtilstand Isolation Unngår sideeffekter med samtidige transaksjoner Durability Varige effekter av committede transaksjoner Innskuddstransaksjon: Samtidighet (1) BEGIN Readln(Kontonr, Belop); Saldo := Read(Kontoer[Kontonr]); Saldo := Saldo + Belop; Write(Kontoer[Kontonr], Saldo); END; Situasjon: 1000 kr på konto nr 10 Kunde 1 setter inn kr 100 Kunde 2 setter inn kr 100 000 Samtidighet (2) Systemkræsj (1) Overføringstransaksjon mellom kontoer: Proc Overfor(Frakonto, Tilkonto, Belop); BEGIN Saldo := Read(Kontoer[Frakonto]); Saldo := Saldo - Belop; Write(Kontoer[Frakonto], Saldo); Saldo := Read(Kontoer[Tilkonto]); Saldo := Saldo + Belop; Write(Kontoer[Tilkonto], Saldo); Mister effekten av Transaksjon 2 Tapt oppdatering (eng: Lost update) END;
Systemkræsj (2) Anta 500 på konto 1 og 2 Overfør 100 fra konto 1 til 2 Halve transaksjonen reflekteres i databasen Feiltyper Systemfeil: Tap av flyktig lager (RAM) Strømbrudd Operatørfeil Programvarefeil i DBMS eller operativsystem Katastrofe: Tap av stabilt lager (disk) Operatørfeil Diskhodekræsj Utro tjener Brann, eksplosjon, ol. Håndtering av systemfeil Tap av minne (RAM) Transaksjonstilstander Databasebuffer Logger til stabilt lager underveis Tre hovedtyper UNDO-logging REDO-logging UNDO/REDO-logging Effektivitet Sjekkpunkt Lager/minne Eksempeltransaksjon (1) Eksempeltransaksjon (2) Database med to elementer, A og B. Konsistenskrav: A = B Transaksjon: A := A*2 B := B*2
DBMS-arkitektur Forutsetninger Ser bort fra samtidighetsstyring (eng: Concurrency Control) Antar en diskblokk som datagranularitet Diskblokk: 512 4092 Byte Mer om disse problemstillingene: Kapittel 18, Concurrency Control Kapittel 19, More About Transaction Management Bufferblokk DBMS-Buffer Plass til en diskblokk (noen KB) Dirty bit 1 når blokka er endret, 0 ellers Pin-unpin bit 1 låser blokka i minne, 0 når den kan skrives til disk Datablokker Loggblokker Steal / No-steal Ved steal kan en bufferblokk skrives til disk før transaksjonen committer Force / No-force Vedforce blir alle bufferblokker skrevet til disk når transaksjonen committer UNDO-logging UNDO-logging: Regler Ved feilsituasjoner fjernes effekter av transaksjoner som ikke har committet. Logg: Fil der vi legger til på slutten ( historie ) Loggposter: <START T> <COMMIT T> <ABORT T> <T, X, v> (v = gammel verdi (before image)) Regel 1 ( gjør UNDO mulig ): Loggposten (<T,X,v>) må skrives til disk (logg) før den nye verdien til X skrives til disk (databasen). Regel 2 ( unngår REDO ): Ved commit av en transaksjon kan commitloggposten skrives til disk først etter at alle oppdaterte dataelementer er skrevet til disk. Steal/force
UNDO-logging: Eksempel UNDO-logging: Recovery UNDO alle ufullførte transaksjoner (ikke committet) Start ved slutten av loggen Sett tilbake førverdien for alle loggposter som tilhører ufullførte transaksjoner LOGG-lengde: Sjekkpunkt Eksempellogg Enkle sjekkpunkt: 1. Stopp opptak av nye transaksjoner 2. Vent til alle aktive transaksjoner har avsluttet. 3. Skriv loggen til disk (flush log) 4. Skriv en sjekkpunktpost (<CKPT>) 5. Skriv loggen til disk (flush log) 6. Start opptak av nye transaksjoner Kan slette loggen før sjekkpunktposten Dynamisk sjekkpunkt (nonquiescent checkpointing) Eksempellogg 1. Skriv loggpost: <START CKPT (T 1,...,T k )> der T 1,...T k er de aktive transaksjonene 2. Flush loggen 3. Vent til T 1,...T k har avsluttet, men slipp til nye transaksjoner 4. Skriv loggpost: <END CKPT> 5. Flush loggen
LOGG-lengde REDO-logging Når <END CKPT>-posten er skrevet, kan loggen før starten av sjekkpunktet kastes UNDO-logging: Committer etter at all skriving til disk er gjort ( immediate update ) REDO-logging: All skriving til disk etter commit ( deferred update ) No-steal / no-force Loggpost: <T, X, v> (v = ny verdi (after image)) Write-ahead logging rule REDO-logging: Eksempel Før endring av databaseelement X på disk: 1. Endringsloggpost på disk: <T,X,v> 2. Commit-loggpost på disk: <COMMIT, T> Trenger aldri å omgjøre skrivinger i databasen (UNDO) Kan måtte skrive committede endringer etter systemfeil (REDO) REDO-logging: Recovery REDO alle transaksjoner som har committet Start ved begynnelsen av loggen. Sett inn nyverdien for alle loggposter som tilhører transaksjoner som har committet. REDO-logging: Sjekkpunkt Oppdateringer gjort av committede transaksjoner må tvinges til disk 1. Skriv loggpost <START CKPT (T 1,...,T k )> der T 1,...T k er de aktive transaksjonene 2. Flush logg 3. Skriv til disk alle bufferblokker oppdatert av committede transaksjoner 4. Skriv <END CKPT> og flush logg
Eksempellogg Logg-lengde UNDO kontra REDO logging UNDO Steal / Force Skriver alle bufferblokker før committ (mye disk I/O) REDO No-steal / No-force Skriver ingen bufferblokker før committ (minnekrevende) Committer så snart loggblokkene er skrevet til disk. UNDO/REDO-logging Steal / No-force Logg-post: <T, X, v, w> (v = gammel verdi (before image), w = ny verdi (after image)) Logge-regel: Ingen skriving til disk (databasen) før den tilhørende loggposten er skrevet til disk. Commit-loggposter flushes umiddelbart UNDO/REDO-logging: Recovery Sjekkpunkter 1. REDO committede transaksjoner fra starten av loggen og fremover. 2. UNDO alle andre transaksjoner fra slutten av loggen og bakover. 1. Skriv loggpost <START CKPT (T 1,...,T k )> der T 1,...T k er de aktive transaksjonene 2. Flush logg 3. Skriv til disk alle dirty buffre 4. Skriv <END CKPT> og flush logg
Logg-lengde Loggestrategier Force No-force Steal UNDO NO-REDO UNDO REDO No-steal NO-UNDO NO-REDO (*) NO-UNDO REDO (*) For eksempel shadow paging (ikke pensum) Håndtering av katastrofale feil Tap av stabilt lager (disk) Arkivkopi lagret adskilt fra databasen Logg endringer siden dump