Napplókezelő és tranzakciókezelő
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
- Felkészülés a hibára - Naplózás
- 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
- OO megfelelő:
- Relációsor
- OO megfelelője:
objektum
- OO megfelelője:
- 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
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ésWRITEa tranzakció művelete a puffer feléINPUTésOUTPUTa puffer művelete a lemez felé- Egyes esetekben
OUTPUT-ot a naplózási rendszer is végez
- Egyes esetekben
INPUT(X)
X adatbáziselemet tartalmazó lemezblokkot fogjuk, beolvassuk és a pufferbe tesszük
READ(X,t)
Xadatbáziselemt bemásolásatlokális változójába- Ha még nincs a pufferben, végezzük el az INPUT műveletet
WRITE(X,t)
- A
tlokális változó értékére állítuk azXpufferbeli é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
Xpufferbeli é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
Xminden blokkja, vagy nem ír ki semmit
- Vagy lemezre kerül
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
COMMITesetén a változtatások a lemezen is megtörténjen
- Hogy
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