21. Adatbázisok optimalizálása és konkurencia kezelése Flashcards

1
Q

Adatbázis-kezelő rendszer

A

Adatbázis-kezelő rendszer alatt olyan számítógépprogramot értünk, mely megvalósítja nagy tömegű adat biztonságos tárolását, gyors lekérdezhetőségét és módosíthatóságát, tipikusan egyszerre több felhasználó számára.

Az adatbázis-kezelési tevékenységeket két csoportra szokás osztani: adatmanipulációra (lekérdezés), illetve definiálásra (adatszerkezetek kialakítása, módosítása).
Az adatok manipulációjára szolgáló nyelveket összefoglalóan Data Manipulation Language-nek (DML), míg a definíciós eszközökkel rendelkező nyelveket Data Definition Language-nek (DDL) szokás nevezni.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Lekérdezésfordító

A

A lekérdezésfordító elemzi és optimalizálja a lekérdezést, ami alapján elkészíti a lekérdezés-végrehajtási tervet (lekérdezéstervet).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Végrehajtómotor

A

A végrehajtómotor a lekérdezésfordítótól megkapja a lekérdezéstervet, majd kisebb
adatdarabokra (tipikusan rekordokra, egy reláció soraira) vonatkozó kérések sorozatát adja át az erőforrás-kezelőnek.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Erőforrás-kezelő

A

Az erőforrás-kezelő ismeri a relációkat tartalmazó adatfájlokat, a fájlok rekordjainak formátumát, méretét, valamint az indexfájlokat. Az adatkéréseket az erőforrás-kezelő lefordítja lapokra, amit átad a pufferkezelőnek.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Pufferkezelő

A

Feladata, hogy a másodlagos adattárolóról (lemez, stb.) az adatok megfelelő részét olvassa be a központi memória puffereibe. A pufferkezelő információkat cserél a tárkezelővel, hogy megkapja az adatokat a lemezről.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Tárkezelő

A

Adatokat ír-olvas a másodlagos adattárolóról. Előfordulhat, hogy igénybe veszi az oprendszer parancsait is, de sokszor közvetlenül a lemezkezelőhöz intézi a parancsait.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Tranzakciókezelő

A

A lekérdezéseket és más tevékenységeket tranzakciókba szervezzük. A tranzakciók olyan egységek, amelyeket atomosan és elkülöníthetően kell végrehajtani, valamint a végrehajtásnak tartósnak kell lennie, illetve a tranzakció végrehajtása nem állíthat elő érvénytelen adatbázis-állapotot (azaz konzisztens). Ezeket a követelményeket
az ACID mozaikszóval szokás összefoglalni. A tranzakciókezelő hajtatja végre a tranzakciókat és gondoskodik a naplózásról és helyreállításról, valamint a konkurenciakezelésről.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Indexstruktúrák

A

Az indexek keresést gyorsító segédstruktúrák. Több mezőre is lehet indexet készíteni. Nem csak a főfájlt, hanem az indexet is karban kell tartani, ami plusz költséget jelent. Ha a keresési mező egyik indexmezővel sem esik egybe akkor kupac szervezést jelent. Az indexrekordok szerkezete (a,p) , ahol “a” egy érték az indexelt oszlopban, “p” egy blokkmutató, arra a blokkra mutat, amelyben az A=a értékű rekordot tároljuk. Az index mindig rendezett az indexértékek szerint.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Elsődleges index

A

Elsődleges index esetén a főfájl is rendezett (az indexmező szerint), így emiatt csak egy elsődleges indexet lehet megadni. Elég a főfájl minden blokkjának legkisebb rekordjához készíteni indexrekordot, így azok száma: T(I) = B (ritka index). Indexrekordból sokkal több fér egy blokkba, mint a főfájl rekordjaiból: bf(I) > > bf, azaz az indexfájl sokkal kisebb rendezett fájl, mint a főfájl: B(I) = B/bf(I) < < B = T/bf.

Keresésnél, mivel az indexfájlban nem szerepel minden érték, ezért csak fedő értéket kereshetünk, a legnagyobb olyan indexértéket, amely a keresett értéknél kisebb vagy egyenlő. Fedő érték keresése az index rendezettsége miatt bináris kereséssel történik: log{2}(B(I)). A fedő indexrekordban szereplő blokkmutatónak megfelelő blokkot még be kell olvasni. Így a költség 1+log{2}(B(I)) < < log{2}(B) (rendezett
eset).
Módosításnál a rendezett fájlba kell beszúrni. Ha az első rekord változik a blokkban, akkor az indexfájlba is be kell szúrni, ami szintén rendezett. A megoldás az, hogy üres helyeket hagyunk a főfájl, és az indexfájl blokkjaiban is. Ezzel a tárméret duplázódhat, de a beszúrás legfeljebb egy főrekord, és egy indexrekord visszaírását jelenti.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Másodlagos index

A

Másodlagos index esetén a főfájl rendezetlen (az indexfájl mindig rendezett).

Másodlagos indexből többet is meg lehet adni. A főfájl minden rekordjához kell készíteni indexrekordot, így az indexrekordok száma: T(I) = T (sűrű index). Indexrekordból sokkal több fér egy blokkba, mint a főfájl rekordjaiból: bf(I) > > bf, azaz az indexfájl sokkal kisebb fájl, mint a főfájl: B(I) = T/bf(I) < < B =T/bf.

Az indexben a keresés az index rendezettsége miatt bináris kereséssel történik: log{2}(B(I)) . A talált indexrekordban szereplő blokkmutatónak megfelelő blokkot még be kell olvasni. Így a költség 1+log{2}(B(I)) < < log{2}(B) (rendezett eset). Az elsődleges indexnél rosszabb a keresési idő, mert több az
indexrekord. A főfájl kupac szervezésű. Rendezett fájlba kell beszúrni. Ha az első rekord változik a blokkban, akkor az indexfájlba is be kell szúrni, ami szintén rendezett. Megoldás: üres helyeket hagyunk a főfájl, és az indexfájl blokkjaiban is. Ezzel a tárméret duplázódhat, de a beszúrás legfeljebb egy főrekord és egy
indexrekord visszaírását jelenti.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Bitmap index

A

A bitmap indexeket az oszlopok adott értékeihez szokták hozzárendelni, az alábbi módon:
- Ha az oszlopban az i. sor értéke megegyezik az adott értékkel, akkor a bitmap index i. tagja egy 1-es.
- Ha az oszlopban az i. sor értéke viszont nem egyezik meg az adott értékkel, akkor a bitmap index i. tagja egy 0.

Így egy lekérdezésnél csak megfelelően össze kell AND-elni, illetve OR-olni a bitmap indexeket, és az így kapott számsorozatban megkeresni, hol van 1-es. A bináris értékeket szokás szakaszhossz kódolással tömöríteni a hatékonyabb tárolás érdekében.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Többszintű indexek

A

Az indexfájl (1. indexszint) is fájl, ráadásul rendezett, így ezt is meg lehet indexelni, elsődleges index-szel. A főfájl lehet rendezett vagy rendezetlen (az indexfájl mindig rendezett) . A t. szintű index: az indexszinteket is indexeljük, összesen t szintig.
A t. szinten bináris kereséssel keressük meg a fedő indexrekordot. Követjük a mutatót, minden szinten, és végül a főfájlban: log{2}(B(I(t))) + t blokkolvasás. Ha a legfelső szint 1 blokkból áll, akkor t+1 blokkolvasást jelent. Minden szint blokkolási faktora megegyezik, mivel egyforma hosszúak az indexrekordok.

A t. szinten 1 blokk: 1 = B/(bf(I)^t). Azaz t = log{bf(I)}(B) = log{2}(B), tehát jobb a rendezett fájlszervezésnél. A log{bf(I)}(B) < log{2}(B(I)) is teljesül általában, így az egyszintű indexeknél is gyorsabb.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

B-fa index

A

Logikailag az index egy rendezett lista. Fizikailag a rendezett sorrendet táblába rendezett mutatók biztosítják. A fa struktúrájú indexek B-fákkal ábrázolhatóak. A B-fák megoldják a bináris fák kiegyenlítetlenségi problémáját, mivel “alulról” töltjük fel őket. A B-fa egy csomópontjához több kulcsérték tartozhat. A mutatók más csomópontokra mutatnak, és így az összes kulcsértékre az adott csomóponton.

Mivel a B-fák kiegyenlítettek (minden ág egyenlő hosszú, vagyis ugyanazon a szinten fejeződik be), kiküszöbölik a változó elérési időket, amik a bináris fákban megfigyelhetőek. Bár a kulcsértékek és a hozzájuk kapcsolódó címek még mindig a fa minden szintjén megtalálhatók, és ennek eredménye:
egyenlőtlen elérési utak, és egyenlőtlen elérési idő, valamint komplex fakeresési algoritmus az adatfájl logikailag soros olvasására. Ez kiküszöbölhető, ha nem engedjük meg az adatfájl címek tárolását levélszint felett. Ebből következően: minden elérés ugyanolyan hosszú utat vesz igénybe, aminek egyenlő elérési idő az eredménye, és egy logikailag soros olvasása az adatfájlnak a levélszint elérésével megoldható. Nincs szükség komplex fakeresési algoritmusra.

A B+ fa egy olyan B-fa, mely legalább 50%-ban telített. A szerkezeten kívül a telítettséget biztosító algoritmusokat is beleértjük.
A B* fa egy olyan B-fa, mely legalább 66%-ban telített.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Hasító index

A

A rekordok edényekbe (bucket) particionálva helyezkednek el, melyekre a h hasítómezőn értelmezett függvény osztja szét őket. Hatékony egyenlőségi keresés, beszúrás, és törlés jellemzi, viszont nem támogatja az intervallumos keresést.

A rekordokat blokkláncokba soroljuk, és a blokklánc utolsó blokkjának első üres helyére tesszük a rekordokat a beérkezés sorrendjében. A blokkláncok száma lehet előre adott (statikus hasítás, ekkor a számot K-val jelöljük), vagy a tárolt adatok alapján változhat (dinamikus hasítás).
A besorolás az indexmező értékei alapján történik. Egy y h(x) ∈ {1, .., K} hasító függvény értéke mondja meg, hogy melyik kosárba tartozik a rekord, ha x volt az indexmező értéke a rekordban. A hasító függvény általában maradékos osztáson alapul (például mod(K)). Akkor jó egy hasító függvény, ha nagyjából egyforma hosszú blokkláncok keletkeznek, azaz egyenletesen sorolja be a rekordokat. Ekkor a blokklánc B/K blokkból áll.

A keresés költsége:
- Ha az indexmező és keresési mező eltér, akkor kupac szervezést jelent.
- Ha az indexmező és keresési mező megegyezik, akkor csak elég a h(a) sorszámú kosarat végignézni, amely B/K blokkból álló kupacnak felel meg, azaz B/K legrosszabb esetben. A keresés így K-szorosára gyorsul.

A tárméret B, ha minden blokk nagyjából tele van. Nagy K esetén azonban sok olyan blokklánc lehet, amely egy blokkból fog állni, és a blokkban is csak 1 rekord lesz. Ekkor a keresési idő: 1 blokkbeolvasás, de B helyett T számú blokkban tároljuk az adatokat. Módosításnál B/K blokkból álló kupac szervezésű kosarat kell módosítani

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Lekérdezés végrehajtás lépései

A
  1. Elemzés: egy elemző fát építünk fel, amely a lekérdezést és annak szerkezetét jellemzi (attribútumok, táblák, jogosultságok ellenőrzése)
  2. Lekérdezés átírás: Az elemző fából egy kezdeti lekérdezéstervet készítünk, amelyet átalakítunk egy ezzel ekvivalens tervvé, aminek végrehajtási ideje várhatóan kisebb lesz. Elkészül a logikai lekérdezésterv, amely relációs algebrai kifejezéseket tartalmaz.
  3. A logikai tervet átalakítjuk fizikai tervvé úgy, hogy a logikai terv operátoraihoz kiválasztunk egy algoritmust, valamint meghatározzuk az operátorok végrehajtási sorrendjét. A fizikai terv olyan részeket is tartalmaz, hogy pl. kell-e rendezni, hogyan férünk hozzá az adatokhoz.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Algebrai optimalizálás

A

Az optimalizáló algoritmus a következő heurisztikus elveken alapul:
- Minél hamarabb szelektáljunk, hogy a részkifejezések várhatóan kisebb relációk legyenek.
- A szorzás utáni kiválasztásokból próbáljunk természetes összekapcsolásokat képezni, mert az összekapcsolás hatékonyabban kiszámolható, mint a szorzatból történő kiválasztás.
- Vonjuk össze az egymás utáni unáris műveleteket (kiválasztásokat és vetítéseket), és ezekből lehetőleg egy kiválasztást, vagy vetítést, vagy kiválasztás utáni vetítést képezzünk. Így csökken a műveletek száma, és általában a kiválasztás kisebb relációt eredményez, mint a vetítés.
- Keressünk közös részkifejezéseket, amiket így elég csak egyszer kiszámolni a kifejezés kiértékelése során.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Konzisztens adatbázis

A

Az adatbázisokra különböző megszorítások adhatóak meg. Az adatbázis konzisztens állapotban van, ha kielégíti az összes ilyen megszorítást. Konzisztens adatbázis egy olyan adatbázis, amely konzisztens állapotban van.

A konzisztencia sérülhet a következő esetekben:
- Tranzakcióhiba: hibásan megírt, rosszul ütemezett, félbehagyott tranzakciók.
- Adatbázis-kezelési hiba: az adatbázis-kezelő valamelyik komponense nem, vagy rosszul hajtja végre a feladatát.
- Hardverhiba: elvész egy adat, vagy megváltozik az értéke.
- Adatmegosztásból származó hiba.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Tranzakció

A

Konzisztenciát tartó adatbázis-műveletek sorozata. Ezek után mindig feltesszük, hogy ha a T tranzakció indulásakor az adatbázis konzisztens állapotban van, akkor ha T egyedül fut le, az adatbázis konzisztens állapotban
lesz a futás végén (közben kialakulhat inkonzisztens állapot).

19
Q

ACID

A
  • Atomiság (atomicity): A tranzakció utasításai vagy mind végrehajtódnak, vagy egyik
    sem.
  • Konzisztencia (consistency): A tranzakció futása után az adatbázis konzisztens marad.
  • Elkülönítés (isolation): Párhuzamosan futó tranzakciók eredménye megegyezik az
    egymás után végrehajtott tranzakciókkal.
  • Tartósság (durability): A tranzakció eredménye nem veszhet el semmilyen hiba esetén

A konzisztenciát mindig adottnak tekintjük. A másik három tulajdonságot viszont az adatbázis-kezelő rendszernek kell biztosítania, de ettől időnként eltekintünk. Feltesszük, hogy az adatbázis adategységekből, elemekből áll. Az adatbáziselem a fizikai adatbázisban tárolt adatok egyfajta funkcionális egysége, amelynek értékét tranzakciókkal lehet elérni (kiolvasni) vagy módosítani (kiírni). Adatbáziselem
pl. a reláció, relációsor, lap.

20
Q

Tranzakció alaptevékenységei

A

A tranzakció és az adatbázis kölcsönhatásának 3 fontos helyszíne van:
- Az adatbázis elemeit tartalmazó lemezblokkok területe
- A pufferkezelő által használt virtuális vagy valós memóriaterület
- A tranzakció memóriaterülete

Ahhoz, hogy a tranzakció egy adatbáziselemet beolvashasson, azt előbb memóriapuffer(ek)be kell hozni, ha még nincs ott.
Ezt követően tudja a puffer(ek) tartalmát a tranzakció saját memóriaterületére beolvasni. Az adatbáziselem új értékének kiírás fordítva történik: előbb a tranzakció kialakítja az új értéket saját memóriaterületén, majd ez az érték másolódik át a megfelelő puffer(ek)be.

A pufferek tartalmának lemezre írásáról a pufferkezelő dönt. Vagy azonnal lemezre írja a változásokat, vagy nem.

A naplózási algoritmusokn és más tranzakciókezelő algoritmusok tanulmányozása során különböző jelölésekre lesz szükség, melyekkel a különböző területek közötti adatmozgásokat írhatjuk le. A következő alapműveletek használjuk:

  • INPUT(X): Az X adatbáziselemet tartalmazó lemezblokk másolása a pufferbe.
  • READ(X,t): Az X adatbáziselem bemásolása a tranzakció t lokális változójába. Ha az X-et tartalmazó blokk még nincs a memóriában, akkor INPUT(X)-et is beleértjük.
  • WRITE(X,t): A t lokális változó tartalmaz az X adatbáziselem memóriapufferbeli tartalmába másolódik. Ha az X-et tartalmazó blokk még nincs a pufferben, akkor előbb INPUT(X) is végrehajtódik.
  • OUTPUT(X): Az X adatbáziselemet tartalmazó blokk kiírása lemezre.

A továbbiakban feltételezzük, hogy egy adatbáziselem nem nagyobb egy blokknál.

21
Q

Naplózás és helyreállítás

A

Az adatokat meg kell védeni a rendszerhibáktól, ezért szükség van az adatok helyreállíthatóságára. Erre az elsődleges technika a naplózás, amely valamilyen biztonságos módszerrel rögzíti az adatbázisban végrehajtott módosítások történetét.

A napló (log) nem más, mint naplóbejegyzések (log records) sorozata, melyek arról tartalmaznak információt, hogy mit tett egy tranzakció. Rendszerhiba esetén a napló segítségével rekonstruálható, hogy mit tett a tranzakció a hiba fellépéséig.

22
Q

Naplóbejegyzések

A

Úgy kell tekintenünk, hogy a napló, mint fájl kizárólag bővítésre van megnyitva. Tranzakció végrehajtásakor a naplókezelőé a feladat, hogy minden fontos eseményt rögzítsen a naplóban.

Az összes naplózási módszer által használt naplóbejegyzések:
- (START T): Ez a bejegyzés jelzi a T tranzakció végrehajtásának kezdetét.
- (COMMIT T): A T tranzakció rendben befejeződött, már nem akar további módosításokat végrehajtani.
- (ABORT T): A T tranzakció abortált, nem tudott sikeresen befejeződni. Az általa tett változtatásokat nem kell a lemezre másolni, vagy ha a lemezre másolódtak, akkor vissza kell állítani.

23
Q

Semmiségi (undo) naplózás

A

A semmisségi naplózás lényege, hogy ha nem biztos, hogy egy tranzakció műveletei rendben befejeződtek és minden változtatás lemezre íródott, akkor a tranzakció hatását vissza kell vonni, azaz az adatbázist olyan állapotba kell visszaállítani,
mintha a tranzakció el se kezdődött volna.

A semmisségi naplózásnál szükség van még egy fajta naplóbejegyzésre, a módosítási bejegyzésre, amely egy (T, X, v) hármas, és azt jelenti, hogy a T tranzakció az X adatbáziselemet módosította, és a módosítás előtti értéke X-nek v volt.

Szabályok:
- Ha a T tranzakció módosítja az X adatbáziselemet, akkor a (T, X, v) naplóbejegyzést az előtt kell a lemezre írni, hogy az új értéket a lemezre írná a rendszer.
- Ha a tranzakció hibamentesen befejeződött, akkor a COMMIT bejegyzést csak azután szabad lemezre írni, hogy a tranzakció által végrehajtott összes módosítás lemezre íródott.

24
Q

Helyreállítás semmiségi (undo) naplózás használatával

A

Tegyük fel, hogy rendszerhiba történt. Ekkor előfordulhat, hogy egy tranzakció nem atomosan hajtódott végre, azaz bizonyos módosításai már lemezre íródtak, de mások még nem. Ekkor az adatbázis inkonzisztens állapotba kerülhet.
Ezért rendszerhiba esetén gondoskodni kell az adatbázis konzisztenciájának visszaállításáról. Semmisségi naplózás esetén ez a be nem fejeződött tranzakciók által végrehajtott módosítások semmissé tételét jelenti.

25
Q

Visszaállítás ellenőrzőpont nélkül

A

A legegyszerűbb módszer. Ekkor a teljes naplót látjuk. Az első feladat
a tranzakciók felosztása sikeresen befejezett és befejezetlen tranzakciókra. Egy T tranzakció sikeresen befejeződött, ha van a naplóban (COMMIT T) bejegyzés. Ekkor T önmagában nem hagyhatta inkonzisztens állapotban az adatbázist.
Amennyiben találunk a naplóban (START T ) bejegyzést, de (COMMIT T) bejegyzést nem, akkor feltételezhetjük, hogy T végrehajtott olyan módosítást az adatbázisban, amely még nem íródott ki lemezre. Ekkor T nem komplett
tranzakció, hatását semmissé kell tenni.

Az algoritmus a következő:
A helyreállítás-kezelő elkezdi vizsgálni a naplóbejegyzéseket az utolsótól kezdve, visszafelé haladva, közben feljegyzi azokat a T tranzakciókat, melyre (COMMIT T) vagy (ABORT T) bejegyzést talál. Visszafelé haladva, amikor (T, X, v) naplóbejegyzést lát:
- Ha T-re találkozott már COMMIT bejegyzéssel, akkor nem tesz semmit
- Más esetben T nem teljes, vagy abortált. Ekkor a helyreállítás-kezelő az X adatbáziselem értékét v-re változtatja.

A fenti változtatások végrehajtás után minden nem teljes T tranzakcióra (ABORT T)-t ír a napló végére és kiváltja a napló lemezre írását. Ezt követően az adatbázis normál használata folytatódhat.

26
Q

Ellenőrzőpont-képzés

A

A helyreállítás elvben a teljes napló átvizsgálását igényelné. Ha undo naplózást használunk, akkor ha egy T tranzakcióra van COMMIT bejegyzés a naplóban, akkor a T tranzakcióra vonatkozó bejegyzések nem szükségesek a helyreállításhoz, viszont
nem feltétlenül igaz az, hogy törölhetjük a T tranzakcióra vonatkozó COMMIT előtti bejegyzéseket. A legegyszerűbb megoldás időnként ellenőrzőpontokat készíteni.

Az egyszerű ellenőrzőpont képzése:
1. Új tranzakció inditására vonatkozó kérések leállítása
2. A még aktív tranzakciók befejeződésének és a COMMIT / ABORT bejegyzés naplóba írásának kivárása
3. A napló lemezre írása
4. A (CKPT) naplóbejegyzés képzése, naplóba írása, majd a napló lemezre írása
5. Tranzakcióindítási kérések kiszolgálásának újraindítása

Az ellenőrzőpont előtt végrehajtott tranzakciók befejeződtek, módosításaik lemezre kerültek. Ezért elég az utolsó ellenőrzőpont utáni részét elemezni a naplónak a helyreállításnál.

27
Q

Ellenőrzőpont létrehozása a rendszer működése közben

A

Az egyszerű ellenőrzőpont-képzéssel az a probléma, hogy nem engedi új tranzakciók elindítását, amíg az aktív tranzakciók be nem fejeződnek. Ez viszont még sok időt igénybe vehet, a felhasználó számára pedig leállítottnak tűnik a rendszer, hiszen nem tud új tranzakciót indítani. Ezt nem engedhetjük meg. Egy bonyolultabb módszer azonban lehetővé teszi ellenőrzőpont képzését anélkül, hogy az új tranzakciók indítását fel kellene függeszteni.

E módszer lépései:
1. (START CKPT(T1, T2, …, Tk)) bejegyzés készítése és a napló lemezre írása. T1, …, Tk az éppen aktív, befejezetlen tranzakciók.
2. Meg kell várni a T1, …, Tk tranzakciók befejeződését. Ekőzben indithatóak új tranzakciók.
3. Ha az ellenőrzőpont-képzés kezdetén még aktív T1, .., Tk tranzakciók mndegyike befejeződött, akkor (END CKPT) naplóbejegyzés készítése és lemezre írása.

Helyreállítás: Visszafelé elemezve megtaláljuk a be nem fejezett tranzakciókat, az ezen tranzakciók által módosított adatbáziselemek tartalmát a régi értékre állítjuk vissza. Két eset fordulhat elő, vagy
- (END CKPT) naplóbejegyzéssel találkozunk előbb. Ez esetben az összes be nem fejezett tranzakcióra vonatkozó bejegyzés megtalálható a legközelebbi (START CKPT(T1, …, Tk)) bejegyzésig. Az ennél korábbiakkal nem foglalkozunk.
- (START CKPT(T1, …, Tk)) naplóbejegyzéssel találkozunk előbb. Ez esetben a hiba ellenőrzőpont-képzés közben történt. Ekkor a T1, …, Tk tranzakciók közül a legkorábban elindítottnak a START bejegyzéséig kell visszamenni, ami viszont biztosan az ezt megelőző START CKPT bejegyzés után található.

Általános szabályként, ha END CKPT-ot írunk a lemezre, akkor az azt megelőző START CKPT bejegyzést megelőző bejegyzésekre nincs szükség a helyreállítás szempontjából.

28
Q

Helyrehozó (redo) naplózás

A
  • A helyrehozó naplózás a semmisségi naplózással szemben helyreállításnál figyelmen kívül hagyja a befejezetlen tranzakciókat és befejezi a normálisan befejezettek által végrehajtott változtatásokat.
  • Undo naplózás esetén a COMMIT naplóba írása előtt megköveteljük a módosítások lemezre írását. Ezzel szemben redo naplózás esetén csak akkor írjuk lemezre a tranzakció által végrehajtott módosításokat, ha a COMMIT bejegyzés a naplóba íródott és lemezre került.
  • Undo naplózásnál a módosított elemek régi értékére van szükség helyreállításnál, redo-nál pedig az újra.

Szabályok:
- Ha egy T tranzakció esetén nincs (COMMIT T) bejegyzés a naplóban, akkor tudjuk, hogy T módosításai nem kerültek lemezre, így ezekkel nem kell foglalkozni. Ha viszont T befejeződött, azaz van (COMMIT T) bejegyzés, akkor vagy lemezre kerültek a módosításai, vagy nem. Ezért meg kell ismételni T módosításait. Szerencsére a naplóbejegyzések az új értékeket tartalmazzák.

29
Q

Helyreállítás helyrehozó (redo) naplózás használatával

A
  • Meghatározni azon tranzakciókat, amelyre van COMMIT bejegyzés a naplóban.
  • Elemezni a naplót az elejéről kezdve. Ha (T, X, v) bejegyzést találunk akkor ha T befejezett tranzakció, akkor v értékét kell X-be írni. Ha T befejezetlen, nem teszünk semmit.
  • Ha végigérünk a naplón, akkor minden be nem fejezett T tranzakcióra (ABORT T) naplóbejegyzést írunk a naplóba és a naplót lemezre írjuk.
30
Q

Helyrehozó naplózás ellenőrzőpont-képzéssel

A

Helyrehozó naplózásnál a működés közbeni ellenőrzőpont-képzés a következő lépésekből áll:
1. (START CKPT(T1, T2, …, Tk)) naplóbejegyzés készítése és lemezre írása, ahol T1, … Tk az aktív tranzakciók.
2. Az összes olyan adatbáziselem kiírása lemezre, amelyeket olyan tranzakciók írtak pufferbe, amelyek (START CKPT(T1, T2, …, Tk)) előtt befejeződtek (COMMIT), de puffereik még nem kerültek lemezre.
3. (END CKPT) naplóbejegyzés készítése és lemezre írása.

31
Q

Semmiségi/helyrehozó (undo/redo) naplózás

A

Undo/redo naplózásnál a módosítást jelző naplóbejegyzések (T,X,v,w) alakúak, ami azt jelenti, hogy a T tranzakció az X adatbáziselem értékét v-ről w-re változtatta.

Undo/redo naplózás esetén a következő előírást kell betartani: mielőtt az adatbázis bármely értékét módosítanánk a lemezen, a (T, X, v, w) naplóbejegyzésnek a lemezre kell kerülnie.
Speciálisan a (COMMIT T) bejegyzés megelőzheti és követheti is a módosítások lemezre írását.

32
Q

Helyreállítás undo/redo naplózás használatával

A

Alapelvek:
1. A legkorábbitól kezdve állítsuk helyre minden befejezett tranzakció hatását.
2. A legutolsótól kezdve tegyük semmissé a be nem fejezett tranzakciók hatását.

33
Q

Undo/redo naplózás ellenőrzőpont-képzéssel

A
  1. Írjunk a naplóba (START CKPT(T1, …, Tk)) bejegyzést, ahol T1, …, Tk az aktív tranzakciók, majd írjuk lemezre a naplót.
  2. Írjuk lemezre azokat a puffereket, amelyek módosított adatbáziselemeket tartalmaznak (piszkos pufferek). Redo naplózással ellentétben itt minden piszkos puffert lemezre írunk, nem csak a befejezettekét.
  3. Írjunk (END CKPT) naplóbejegyzést a naplóba és írjuk ki a lemezre.
34
Q

Konkurenciakezelés

A

A tranzakciók közötti egymásra hatás az adatbázis inkonzisztenssé válását okozhatja, még akkor is, amikor a tranzakciók külön-külön megőrzik a konzisztenciát és rendszerhiba sem történt. Ezért valamiképpen szabályoznunk kell, hogy a különböző tranzakciók egyes lépései milyen sorrendben következzenek egymás után. Ezt az ütemező végzi, magát a folyamatot pedig konkurenciavezérlésnek hívjuk.

Az alapfeltevésünk (helyességi elv), hogy ha minden egyes tranzakciót külön hajtunk végre, akkor azok megőrzik a konzisztens adatbázis-állapotot. A gyakorlatban viszont a tranzakciók általában konkurensen futnak, ezért a helyességi elv nem alkalmazható közvetlenül. Így olyan ütemezéseket kell tekintenünk, amelyek biztosítják, hogy
ugyanazt az eredményt állítják elő,
mintha a tranzakciókat egymás után, egyesével hajtottuk volna végre.

35
Q

Konkurenciakezelés - Ütemezések

A

Az ütemezés egy vagy több tranzakció által végrehajtott lényeges műveletek időrendben vett sorozata. Az ütemezéseknél csak az írási és olvasási műveletekkel foglalkozunk.

Soros ütemezés: Egy ütemezés soros, ha bármely T és T’ tranzakcióra, ha T-nek van olyan művelete amely megelőzi T’ valamely műveletét, akkor T minden művelete megelőzi T’ minden műveletét. A soros ütemezést a tranzakciók felsorolásával adjuk meg, pl (T1, T2).

Sorbarendezhetőség: Egy ütemezés sorba rendezhető, ha ugyanolyan hatással van az adatbázis állapotára, mint valamelyik soros ütemezés, függetlenül az adatbázis kezdeti állapotától.

36
Q

Konkurenciakezelés - Konfliktus

A

Jelölések:
- w{i}(x) azt jelenti, hogy a Ti tranzakció írja az x adatbáziselemet
r{i}(x) azt jelenti, hogy a Ti tranzakció olvassa az adatbáziselemet.

Konfliktus akkor van, ha van olyan egymást követő műveletpár az ütemezésben, amelynek ha a sorrendjét felcseréljük, akkor legalább az egyik tranzakció viselkedése megváltozik. Tegyük fel, hogy Ti és Tj különböző tranzakciók.
Ekkor nincs konfliktus, ha a pár:
- r{i}(X) és r{j}(Y), még akkor sem, ha X=Y. Azaz két különböző tranzakció által végrehajtott olvasási művelet sosem áll konfliktusban egymással, még akkor sem, ha ugyanarra az adatbázis-elemre vonatkoznak.
- r{i}(X) és w{j}(Y), ha X!=Y
- w{i}(X) és r{j}(Y), ha X!=Y
- w{i}(X) és w{j}(Y), ha X != Y

Konfliktus van, ha:
- Ugyanannak a tranzakciónak bármely két művelete konfliktusban van, hiszen ezek nem cserélhetőek fel.
- Ugyanazt az adatbáziselemet két különböző tranzakció éri el, és ezek közül legalább az egyik írási művelet.

Tehát különböző tranzakciók műveletei nincsenek konfliktusban egymással, azaz felcserélhetőek, hacsak nem
1. ugyanarra az adatbáziselemre vonatkoznak, és
2. legalább az egyik művelet írás

37
Q

Konfliktusekvivalens ütemezések

A

Két ütemezés konfliktusekvivalens, ha szomszédos műveletek nem konfliktusos cseréjével egymásba vihetők.

38
Q

Konfliktus-sorbarendezhető ütemezések

A

Egy ütemezés konfliktus-sorbarendezhető, ha konfliktusekvivalens valamely soros ütemezéssel. A konfliktus-sorbarendezhetőség elégséges, de nem szükséges feltétele a sorbarendezhetőségnek. Piaci rendszerekben a konfliktus-sorbarendezhetőséget ellenőrzik.

39
Q

Konkurenciakezelés - Megelőzési gráf

A

Adott a T1 és T2, stb. tranzakcióknak egy S ütemezése. T1 megelőzi T2-t S-ben, ha van T1-ben olyan A1 művelet, és T2-ben olyan A2 művelet, melyekre:
1. A1 megelőzi A2-t S-ben
2. A1 és A2 ugyanarra az adatbáziselemre vonatkoznak, és
3. legalább az egyik írási művelet

Ezek pont azok a feltételek, amikor A1 és A2 konfliktusban vannak, nem cserélhetőek fel. Ezeket a megelőzéseket megelőzési gráffal szemléltetjük. A megelőzési gráf csomópontjai S-beli tranzakciók. Ha a tranzakciókat Ti-vel jelöljük, legyen i a Ti-hez tartozó csomópont a gráfban. Az i csomópontból j csomópontba megy irányított él, ha Ti megelőzi Tj-t.

Egy S ütemezés konfliktus-sorbarendezhető akkor és csak akkor, ha megelőzési gráfja körmentes. Ekkor a megelőzési gráf csúcsainak bármely topologikus rendezése megad
egy konfliktus-ekvivalens soros ütemezést.

40
Q

Konkurenciakezelés - Zárak

A

Zárak használatával is elérhető a konfliktus-sorbarendezhetőség. Ha az ütemező zárakat használ, akkor a tranzakcióknak zárakat kell kérniük és feloldaniuk az adatbáziselemek olvasásán és írásán felül. A zárak használatának két értelemben is helyesnek kell
lennie:
- Tranzakciók konzisztenciája: A műveletek és a zárak az alábbi elvárások szerint kapcsolódnak egymáshoz:
1. A tranzakció csak akkor olvashat vagy írhat egy elemet, ha már korábban zárolta azt, és még nem oldotta fel a zárat.
2. Ha egy tranzakció zárol egy elemet akkor azt később fel kell szabaítania.
- Az ütemezések jogszerűsége: A zárak értelme feleljen meg a szándék szerinti elvárásnak: nem zárolhatja két tranzakció ugyanazt az elemet, csak úgy, ha az egyik előbb már feloldotta a zárat.

41
Q

Zárolási ütemező

A

A zárolási ütemező feladata, hogy akkor és csak akkor engedélyezze a kéréseket, ha
az jogszerű ütemezést eredményez. Ebben segít a zártábla, amely minden adatbáziselemhez megadja azt a tranzakciót, feltéve, hogy van ilyen, amelyik éppen zárolja az adott elemet.

42
Q

Kétfázisú zárolás

A

Kétfázisú zárolásról (2FZ) beszélünk, ha minden tranzakcióban minden zárolási művelet megelőz minden feloldási műveletet. Azok a tranzakciók, amelyek eleget tesznek 2FZ-nek, 2FZ tranzakcióknak nevezzük. Konzisztens, 2FZ tranzakciók jogszerű ütemezése konfliktus-sorbarendezhető.

43
Q

Holtpont

A

Holtpontról beszélünk, ha az ütemező arra kényszerít egy tranzakciót, hogy örökké várjon egy olyan zárra, amelyet egy másik tranzakció tart zárolva. Tipikus példa holtpont kialakulására, ha 2 tranzakció egymás által zárolt elemeket akar zárolni. A kétfázisú zárolás nem tudja megakadályozni holtpontok kialakulását.

44
Q

Konkurenciakezelés - Különböző zármódú zárolási rendszerek

A