Kihagyás

Napplókezelő és tranzakciókezelő

Felépítés

A tranzakciók helyes működésért a tranzakciókezelő felel (duh)


A tranzakciókezelő ehy sor feladatot lát el

  • Jelzéseket ad át a naplókezelőnek olyan formában, hogy arról naplóbejegyzés készülhessen
  • Biztosítja, hogy a párhuzamosan végrehajtott tranzakciók ne havarhassák egymás működését
    • Ütemezés

Tranzakciókezelő

  • A tranzakció tevékenységeiről üzenetet küld a naplókezelőek
  • Üzen a pufferkezelőnek
    • A puffer tartalmát szabad-e, vagy kell-e lemezre másolni
  • Üzen a lekérdezésfeldolgozónak
    • A tranzakció melyik lekérdezését, vagy DML-műveletét kell végrehajtani

Naplókezelő

  • Naplót karban tartja
  • Együttműködik a pufferkezelővel
    • A naplózandó információ elsődlegesen a memóriapufferben jelenik meg
    • Időnként a pufferek tartalmát pedig a lemezre kell írni
  • A napló a lemezen területet foglal el

Hiba

  • Hiba esetén a helyreállítás-kezelő a naplót használva helyreállítja az adatokat
    • A lemez elérése itt a pufferkezelőn kereszül megy

Azt mindig feltesszük, hogy a háttértár nem sérül, csak amemória és a puffer egy része sérül

Ugye ha a hardver felrobban, azt nem oldjuk meg szoftverből

Védelem belső sérülésre

  1. Felkészülés a hibára - Naplózás
  2. Helyreállítás - Konzisztens állapot visszaállítása a naplóval

A naplózás és helyreállítás összhangban vannak, bár több naplózási protokoll is létezik

Adategység

Feltesszük, hogy az adatbázis adategységekből, elemekből áll.

  • Adatbáziselem - database element
    • Fizikai adatbázis egyfajta funkcionális egysége
    • Értékét tranzakciókkal lehet írni, olvasni

Adatbáziselem lehet:

  • Reláció
    • OO megfelelő: osztálykiterjesztés
  • Relációsor
    • OO megfelelője: objektum
  • Lemezblokk
  • Lap

Lap a legjobb választás naplózásram mert a puffer ilyenkor egyszerű elemekből áll

Ha az elem egy része illékony, akkor hiba esetén rábazilikáztunk

Vizsgált meghibásodási modell

A tranzakció és DB kölcsönhatásának 3 fő helyszíne:

  • Lemez
    • Adatbázis elemeit tartalmazó lemezblokkok területe
  • Memória
    • A pufferkezelő által használt virtuális vagy valós memória területe
    • A tranzakció memóriaterülete

I/O

I/O

Olvasás

  • Ahhoz, hogy a tranzakció egy Xadatbázselemet beolvashasson, azt előbb a memóriapuffer(ek)be (P) kell behozni, ha még nincs ott
  • Ezután tudja a tranzakció a saját memóriaterületére(t) olvasni a puffer(ek) tartalmát

Írás

  • Kiírás pedig fordított sorrendben megy
  • A tranzakció a pufferbe mozgat át, ahonnan a lemzre kerül az adat
  • Egy Tranzakcsió sosem nyúlhat a lemezhez közvetlenül
    • Or else ea will come and find you 🫵

Alapműveletek

  • READ és WRITE a tranzakció művelete a puffer felé
  • INPUT és OUTPUT a puffer művelete a lemez felé
    • Egyes esetekben OUTPUT-ot a naplózási rendszer is végez

INPUT(X)

X adatbáziselemet tartalmazó lemezblokkot fogjuk, beolvassuk és a pufferbe tesszük

READ(X,t)

  • X adatbáziselemt bemásolása t lokális változójába
  • Ha még nincs a pufferben, végezzük el az INPUT műveletet

WRITE(X,t)

  • A t lokális változó értékére állítuk az X pufferbeli értékét
  • Igen, ha még nincs a pufferben, akkor végezzük el az INPUT műveletet, majd írjuk bele t értékét

OUTPUT(X)

  • Kimásoljuk X pufferbeli értékét a lemezre

Egy adatbáziselem mérete

Felvetés: az adatbáziselemek elférnek egy-egy lemezblokkban és így egy-egy pufferben is

A feltevészünk így az, hogy az adatbáziselemek pontosan a blokkok

  • Valójában ha egy adatbáziselem nagyobb egy blokknál, akkor minden blokkméretű elemét egy-egy adatbáziselemként értelmezzük
  • A naplózási mechanizmus atomos
    • Vagy lemezre kerül X minden blokkja, vagy nem ír ki semmit

Péda - befejezetlen tranzakció

Konzisztencia feltételünk a példára: \(A=B\)

\(T_1\):

  • \(A \leftarrow A\times 2\)
  • \(B \leftarrow B\times 2\)

Ez pontosabban 8 lépést jelent:

Művelet t M-A M-B D-A D-B
READ(A,t); 8 8 8 8 8
t:= t*2; 16 8 8 8 8
WRITE(A,t); 16 16 8 8 8
READ(B,t); 8 16 8 8 8
t:= t*2; 16 16 8 8 8
WRITE(B,t); 16 16 16 8 8
OUTPUT(A); 16 16 16 16 8
OUTPUT(B); 16 16 16 16 16

Példa végrehajtás:

READ(A,t);
t:= t*2;
WRITE(A,t);
READ(B,t);
t:= t*2;
WRITE(B,t);
OUTPUT(A);
signal: Segmentation fault 💥

Ha itt megállnánk, DB inkonzisztens lenne

Atomosság miatt

  • Nem maradhat így, vagy minden utasítást teljesítünk(amit most nem tudunk), vagy nem változtatunk az adatokon (amit meg már megtettünk)
  • Megoldás: Naplózás
  • A napló naplóbejegyzések (log records) sorozata, ami mindegyike a tranzakció tetteit írja le
  • Rendszerhiba történt, de tudjuk hogy a naplóval visszaálhatunk egy konzisztens állapotra
  • A naplót (az achívummentéssel együtt) használhatjuk akkor is, ha egy, a naplót nem tároló lemezen történt

Naplóbejegyzés

  • A tranzakció legfontosabb történéseit írja le
    • Tᵢ tranzakció kezdődik (Tᵢ, START)
    • Tᵢ A-t írja (Tᵢ, A, <régi érték>, <új érték>)
      • Protokolltól függően elég lehet csak az az új, vagy csak a régi érték
    • Tᵢ rendben befejeződött (Tᵢ, COMMIT)
    • Tᵢ a normálisnál előbb befejeződött (Tᵢ, ABORT)

  • A napló időrendben tartalmazza a történéseket
  • Jellemzően a háttértáron tartjuk, amiről feltesszük, hogy nem sérült meg
    • Mert ha mégis, mit csinálsz 💀
  • Nem mindegy, mikor írjuk át a naplóbejegyzéseket a pufferből a lemezre
    • Hogy COMMIT esetén a változtatások a lemezen is megtörténjen

Naplózási típusok

  • Egyes tranzakciók hatását vissza kívánjuk vonni
    • Kérjük a DB isteneket, hogy álljunk vissza a tranzakciót megelőző állapotra
    • Semmiségi-UNDO
  • Katasztrófák hatásának javítását követően a tranzakciók hatását meg kell ismételni
    • A bennük foglalt írásokat meg kell ismételni
    • Helyreállító-REDO