<<Elöző fejezet Tartalom Következő fejezet>>

6. Többfelsználós környezet és adatbiztonság
6.1. Tranzakciók
6.2. ACID szabályok
6.3. Adatvesztés elleni védelem

6. Többfelhasználós környezet és adatbiztonság

A többfelhasználós környezetben az egyes felhasználók által végrehajtott módosítások könnyen inkonzisztens adatbázis tartalmat eredményezhetnének. Ennek elkerülésére az adatbáziskezelők tranzakciókat használnak.

Az adatbázisokban tárolt adatok elvesztése óriási károkat okozhatnak, ezért az adatbiztonság nagyon fontos terület, melyet nagyon röviden áttekintünk.

6.1 Tranzakciók

Az eddigiek során nem foglalkoztunk azzal, hogy ha több konkurens felhasználó csatlakozik az adatbázishoz, akkor számos problémával kell megküzdenünk. Mit csinál egy adatbáziskezelő, ha több felhasználó akarja módosítani ugyanazon rekordok tartalmát? Ennél gyakran még összetettebb a dolog, a felhasználók által végrehajtott módosítások egy sorozata (több önálló SQL utasítás) után alakul ki újra egy konzisztens állapot az adatbázisban. Hogyan lehet kezelni azt, hogy a módosítást végrehajtó felhasználó kivételével mindenki az adatbázis konzisztens állapotát lássa? Erre ad megoldást a tranzakcók kezelése a relációs adatbáziskezelőkben. Egy tranzakció mindig egy konzisztens adatbázis állapotból indul ki és a módosítások egy olyan sorozatát tartalmazza, melyek végén ismét egy konzisztens adatbázis tartalom áll elő. A relációs adatbázis kezelők párhuzamosan több tranzakciót is képesek kezelni.

Nézzünk egy egyszerű példát, mely tranzakciók nélkül nehezen lenne kezelhető. Ugyanabban a bankban vezetett két bankszámla között szeretnénk utalást végezni.Az "A" számláról tegyünk át 50 fabatkányi összeget a "B" számlára. Még ha egy adatbázis táblában tároljuk a két számla egyenlegét, akkor sem lehet a feladatot egyetlen SQL utasítással megoldani. Az alábbi hat elemi lépésre bonthatjuk fel a feladatot:

  1. read(A), az A számla egyenlegének beolvasása
  2. A := A - 50, az A számla egyenlegének módosítása
  3. write(B), az A számla új egyenlegének tárolása
  4. read(B), a B számla egyenlegének beolvasása
  5. B := B + 50, a B számla egyenlegének módosítása
  6. write(B), B számla új egyenlegének tárolása

Ha a fenti műveletsor a 3-6 utasítások között valamilyen ok miatt megszakad, akkor az adatbázis inkonzisztens állapotba kerül. Ha a 3-6 lépések között egy másik tranzakció is az "A" számla tartalmát szeretné módosítani, akkor egy inkonzisztens állapoton fog dolgozni.

A tranzakciók kezdetét a BEGIN SQL utasítással jelöljük meg. Ezután a tranzakció lezárásáig végrehajtott DML utasítások a tranzakció részét képezik. Vigyázat a DDL utasítások végrehajtása előtt és után az adatbáziskezelő lezárja az aktuális tranzakciót az adatok tárolásával! A tranzakció kétféleképpen zárható le. A COMMIT SQL utasítás véglelgesíti az adatbázisban a módosításokat, ezután minden felhasználó a COMMIT utáni konzisztens képet látja. A ROLLBACK SQL utasítással a tranzakció össze módosítását visszavonhatjuk, a felhasználók továbbra is a tranzakció indítása előtti konzisztens adatbázis képet látják. A relációs adatbázis kezelők nem biztosítanak lehetőséget a tranzakciók egymásba ágyazására. Amennyiben a tranzakcióba bevont műveleteket csak egy bizonyos pontig szeretnénk visszavonni, akkor a SAVEPOINT és a ROLLBACK TO utasításokat használhatjuk. A SAVEPOINT utasítással névvel elnevezhetünk egy pontot a tranzakcióban, a ROLLBACK TO utasítással a megadott nevű pontig vonhatjuk vissza a tranzakciót. Az adatbáziskezelők azon funkcióit, melyek a többfelhasználós környezetben biztosítják minden felhasználó számára a konzisztens adatbázis képet az ACID rövidítéssel jellemzik (Atomicity, Cosistency, Isolation, Durability - Atomikusság, Konzisztencia, Elszigeteltség, Állandóság).

6.2 ACID szabályok

Atomikusság (Atomicity)
A tranzakcióba bevont DML utasításokat egy egységként kell kezelnie az adatbáziskezelőnek, például, ha a tranzakció végrehajtása valamilyen hardver, szoftver hiba miatt megszakad, akkor az adatbáziskezelőnek automatikusan vissza kell vonnia az addig végrahatott műveleteket, hogy a tranzakció kezdése előtti konzisztens állapot álljon elő.
Konzisztencia (Consistency)
A tranzakció befejezése után az adatbázisnak konzisztens állapotba kell kerülnie.
Elszigeteltség (Isolation)
A párhuzamosan futó tranzakcióknak egymástól függetlenül kell működniük. Minden felhasználónak úgy kell tünnie mintha csak ő használná az adatbázist. Hatékonysági okokból nem lehet a függetlenséget úgy biztosítani, hogy egyidőben csak egy tranzakció futhat az adatbázison. Helyette sor illetve tábla zárolásokat alkalmaznak az adatbáziskezelők.
Állandóság (Durability)
A lezárt tranzakciók eredménye nem veszhet el. Hatékonysági okokból az adatbáziskezelők nem írják rögtön diszkre a módosított adatokat, hanem memóriában tárolják. Például egy hardver hiba a memória tartalmo és így a tranzakció eredményének elvesztésével járhatna. Az ilyen adatvesztéseket az adatbáziskezelők tranzakció log használatával oldják meg.

6.3. Adatvesztés elleni védelem


6.1 ábra Adatvesztés elleni védelem

Az adatbáziskezelő a tranzakció közben végrehajtott változásokra vonatkozó adatokat a tranzakció log(ok)ba írják ki. A log fájlt célszerű egy másik háttértárolóra tenni mint az adatbázis fájlokat, hogy az esetleges diszk hibák esetén ne veszítsuk el mindkettő tartalmát. Ezután módosítja a tranzakció a memóriába betöltött adatbázis rekordokat. Az adatbáziskezelő a tranzakcióktól független logika alapján menti ki a memóriából az adatokat (jellemzően késleltetetten). Az adatbázis adminisztrátor rendszeres időnként mentéseket (backup) készít az adatbázisfájlok tartalmáról.

Nézzük meg milyen hibák esetén milyen helyreállítási stratégiát alkalmazhatunk.

  1. Hardver/szoftver hiba következtében a memória bufferek tartalma elveszik
    Az adatbázis fájl helyreállítása a tranzakció log tartalma alapján
  2. Lemezhiba következtében az adatbázis fájl elvesztése
    A mentésből visszaállított adatbázis fájl helyreállítása a tranzakció log tartalma alapján
  3. Lemezhiba következtében a tranzakció log elvesztése
    Egy új mentés készítése az adatbázis fájl(ok)ról és egy új tranzakció log indítása. Ha több tranzakció log fájlt használunk, akkor a log fájl helyreállítása másolással.

Az adatbiztonságot tovább növelhetjük a háttértárak RAID rendszerbe szervezésével illetve redundáns adatbázis szerverek működtetésével.
<<Elöző fejezet Tartalom Minta adatok>>