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ójaA- 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
COMMITvé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 mindenT-t érintő lemezművelet megtörtént
Írás sorrendje
- Minden a naplóba kerül
- Csak
COMMITvált ki valódi lemezműveletet - Sikerben csak az
ENDjelenlé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
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
- Ha t nincs befejezve:
- 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
STARTakárhány ellenőrzőponttal lehet hátrébb, letsgoooo
- A
- Be nem fejezett esetén meg csak
<ABORT>