Kihagyás

Redo log (helyrehozó naplózás)

Cél, a végrahajtott utasítások újból lejátszása

Bejegyzés tartalma

<T1, A, 5>

  • T1 - Tranzakció azonosítója
  • A - Módosított mező
  • 5 - A módosítás értéke

Különbség az undo bejegyzés tartalmával, hogy itt az új érték kerül be

Naplózás ideje

  • Mindent előre beírunk a naplóba
    • Ha hiba lesz, ugyebár ott az új érték, amit be kell írni
  • Utána a naplót (!) írjuk csak a lemezre
  • A COMMIT végrahajtása előtt beírunk azt be a naplóba
  • Ezután történnek valóban lemezműveletek
  • Miután a lemezre írások megtörténtek, akkor behozunk egy <T, END> bejegyzést, ezzel jelölve, hogy minden T-t érintő lemezművelet megtörtént

Írás sorrendje

  • Minden a naplóba kerül
  • Csak COMMIT vált ki valódi lemezműveletet
  • Sikerben csak az END jelenlétében lehetünk biztosak
Lépés Tevékenység t M-A M-B D-A D-B Napló
1 <T, START>
2 READ(A,t) 8 8 8 8
3 t:=t*2 16 8 8 8
4 WRITE(A,t) 16 16 8 8 <T,A,16>
5 READ(B,t) 8 16 8 8 8
6 t:=t*2 16 16 8 8 8
7 WRITE(B,t) 16 16 8 8 8 <T,B,16>
7 16 16 8 8 8 <T, COMMIT>
8 FLUSH LOG 16 16 16 8 8
9 OUTPUT(A) 16 16 16 16 8
10 OUTPUT(B) 16 16 16 16 16
11 <T, END>
12 FLUSH LOG
What EA gave us 2, electric boogaloo
(1) Let S = set of transactions with <Ti, commit> in log, bur no <Ti, end> in log
(2) For each <Ti, X, v> in log, in forvard order (earliest -> latest) do:
    if Ti ∈ S then ⎧ - write (X, v)
                   ⎩ - output(X)
(3) For each Ti ∈ S, write <Ti, end>
(4) Flush log

Gyors tippek

  • Elejeétől vesszük a logot
    • Ha t nincs befejezve:
      • nem kezdünk vele semmit (hiszen még nem írtunk a lemezre belőle semmit)
    • Ha t befejezett:
      • A lépést végrehajtjuk
  • Ami nem lett COMMIT-álva, azokat <ABORT>-al lezárjuk
  • Végül FLUSH LOG

Helyreállításkor az utolsó <t, END> lezárásig kell visszamenni, ott tudjuk, hogy minden T-t érintő, és azt megelőző kommitált művelet a lemezre került

Miben más, mint az UNDO?

  • REDO - Ha a kiírások elé vesszük fel a kommitot, megtelhet a puffer
  • UNDO - A pufferben minimális elemet tartunk
  • UNDO - Túl gyakran ír kis részekben -> Rengeteg I/O művelte + random felpörög a lemez
  • REDO - Az írás halasztható, nagy batch-ben elvégezhető

Ellenőrzőpont működés közben

Mivel batch-ben írunk a memóriára, így az ellenőrzőpont lehetne egyetlen pont az időben, nemde?

NEM!

  • <START CKPT(T1, ..., Tk)> esetén T1, ..., Tk az összes éppen aktív tranzakció
  • Minden kommitált, de még be nem fejezett tranzakciót a lemezre írunk
  • <END CKPT> lezár minden kommitált tranzakciót

Ellenőrzőpont helyreállítása

  • Elég csak azokat venni, amik a legutolsó <START CKPT(T1, ..., Tk)> idején aktívak voltak, vagy utána indultak el
  • A legkorábbi T1 START-ig kell menni, korábbra nem
    • A START akárhány ellenőrzőponttal lehet hátrébb, letsgoooo
  • Be nem fejezett esetén meg csak <ABORT>