Többfelhasználós adat-hozzáférés

4.9. Tranzakciók, zárolások és többfelhasználós adatokhoz való hozzáférés.

Bármely adatbázis csak akkor használható, ha az állapota megfelel a domain állapotának. Az ilyen állapotokat integrálják. Nyilvánvaló, hogy az adatok megváltoztatásakor az adatbázisnak át kell térnie az egyik holisztikus állapotról a másikra. Ugyanakkor az adatfrissítés folyamatában szituációk lehetségesek az integritás állapot megsértése esetén. Például:
  • A bankrendszerben a pénzeszközök átkerülnek az egyik számláról a másikra. Az SQL-ben ezt a műveletet két UPDATE parancs sorrendje írja le. Mint látható, az első csapat és a második csapat befejezni az adatbázis nem konzisztens állapotban (a szükséges összeget levonják az első számla, de nem írták jóvá a második). Ha ezen a ponton a rendszer meghibásodik (például kikapcsol), akkor az adatbázis teljes állapota visszaállíthatatlanul elvész.
  • Az adatbázis-integritás megsértheti egy SQL parancs feldolgozása során is. Tegyük fel, hogy a vállalat összes alkalmazottjának fizetését 20% -kal növelik. Ebben az esetben a DBMS soronként feldolgozza az összes olyan rekordot, amelyet frissíteni kell. van egy időintervallum, amikor egyes rekordok új értékeket tartalmaznak, és néhány régi.

Az ilyen helyzetek elkerülése érdekében a DBMS bemutatja egy tranzakció fogalmát - atomos cselekvést egy adatbázisban, amely egy holisztikus állapotból egy másik integrált állapotba kerül. Más szóval, az ügylet olyan műveletek sorozata, amelyeket vagy ki kell egészíteni, vagy mindent nem kell elvégezni (mindent vagy semmit).







A tranzakciók ellenőrzésének módja a naplózás. amely rögzíti a tranzakcióban az adatbázisban végrehajtott összes változtatást. Ha a tranzakció a tranzakció feldolgozása során sikertelen, a tranzakció visszafordul - az adatbázis állapotát visszaállítja a naplóból, amikor a tranzakció elindul.

A különböző szállítóktól a tranzakció kezdete kifejezetten megadható (például a BEGIN TRANSACTION parancssal), vagy implicit (az SQL szabványban meghatározottak szerint). A következő tranzakció automatikusan megnyílik az előző sikeres vagy sikertelen befejezése után. A tranzakció befejezéséhez általában SQL parancsokat használ:
  • COMMIT - sikeresen zárja be a tranzakciót
  • ROLLBACK - visszaforgatási tranzakció, azaz Indítsa vissza az adatbázist azon állapotba, amelyben a tranzakció megkezdődött.
Az SQL szabvány előírja, hogy a tranzakció az első SQL utasítással kezdődik, amelyet a felhasználó kezdeményezett vagy az alkalmazásprogramban tartalmazott. Minden későbbi SQL utasítás a tranzakciós szervet alkotja. A tranzakció az egyik lehetséges módon végződik:
  1. a COMMIT utasítás a tranzakció sikeres befejezését jelzi, az adatbázisban végrehajtott minden változtatás végleges
  2. a ROLLBACK utasítás megszakítja a tranzakciót, és törli az összes változtatást
  3. a tranzakciót kezdeményező program sikeres befejezése a tranzakció sikeres befejezését jelenti (például a COMMIT használatával)
  4. a hibás program-befejezés véget vet a tranzakciónak (ROLLBACK)
Példa egy kifejezetten meghatározott tranzakcióra: Példa egy implicit módon meghatározott tranzakcióra: Sajnos a leírt tranzakciós mechanizmus az adatbázis integritását csak akkor garantálja, ha az összes tranzakció egymás utáni végrehajtása történik. Egyszerre csak egy tranzakció aktív. Ha több felhasználó egyszerre dolgozik az adatokkal, akkor nem valószínű, hogy elégedettek lesznek a kérelem feldolgozásának ilyen módon történő megszervezésével. ez a rendszer reakcióidőjének növekedéséhez fog vezetni. Ugyanakkor, ha két tranzakciót egyszerre hajtanak végre, a következő hibahelyzetek léphetnek fel:





  • Dirty Read - a T1 tranzakció módosított néhány adatelemet. Ezután egy másik T2 tranzakció elolvassa az adatelem tartalmát a T1 tranzakció befejezése előtt. Ha T1-et ölt meg a ROLLBACK művelet. akkor kiderül, hogy a T2 tranzakció elolvassa a nem létező adatokat.
  • Nem ismételhető vagy Fuzzy Read - T1 tranzakció leolvassa az adatelem tartalmát. Ezt követően egy másik T2 tranzakció módosított vagy törölte ezt az elemet. Ha a T1 elolvassa az elem tartalmát, akkor más értéket kap, vagy megállapítja, hogy az adatelem már nem létezik.
  • Phantom (Phantom) - a T1 tranzakció több olyan adatelem tartalmát olvassa le, amely megfelel bizonyos feltételeknek. Ezt követően a T2 létrehozott egy olyan adatelemet, amely megfelel ennek a feltételnek és rögzített. Ha a T1 ugyanolyan feltételekkel ismételje meg az olvasást, akkor újabb adatkészletet kap.
Amint már említettük, e helyzetek egyike sem következhet be, ha a tranzakciókat egymás után végrehajtják. Így a tranzakciók párhuzamos feldolgozásával a sorozatosíthatóság (az áramvonalasítás képessége). Ie egy adott tranzakciócsomag váltakozó (párhuzamos) végrehajtása akkor igaz, ha ugyanazt az eredményt végzi, mint az ugyanazon tranzakciók sorozatos végrehajtása során.

A fent leírt összes helyzet csak azért következett be, mert a T1 és T2 tranzakciók váltakozó végrehajtását nem rendelték meg, azaz nem. ez nem volt egyenértékű a T1 tranzakció először, akkor T2, vagy fordítva, az első T2 tranzakció, majd a T1.

A tranzakciók kényszerített rendelését a záró mechanizmus biztosítja. A lényege a mechanizmus a következő: ha a végrehajtás a tranzakció megköveteli, hogy egy bizonyos adatbázis-objektum (tuple sor sorokat, az a hozzáállás, a kapcsolatrendszer.) Nem változott kiszámíthatatlanul és tudta nélkül ez a tranzakció, az objektum zárolva van. A zárak fő típusai:
  • reteszelő reteszelés. Ezt S-locknak ​​is nevezik (a megosztott zárolásokból) és olvasási zárolásnak.
  • exkluzív zár (kölcsönös hozzáférés nélkül), az úgynevezett X-lock (eXclusive zárak) vagy írása letiltva. Ez az üzemmód objektumok módosításához, hozzáadásához és törléséhez használható.
Ebben az esetben:
  • ha a tranzakció X-lockot ír le az objektumra, akkor minden olyan kérelem, amely egy másik tranzakcióra vonatkozik, amelyik az objektum zárolását elutasítja.
  • Ha a tranzakció az objektumra S-locket ír elő, akkor
    • Egy másik X-lock tranzakcióra irányuló kérelem ezen az objektumon elutasításra kerül
    • Egy másik, az objektum S-zárjaival végrehajtott tranzakcióra vonatkozó kérelem elfogadásra kerül
Az a tranzakció, amely hozzáférést kér egy olyan objektumhoz, amelyet egy másik összeférhetetlen módban már elfogott, leáll, amíg az objektum elfogása meg nem szűnik.

Bebizonyosodott, hogy a serializable tranzakciót (vagy, más módon, a szigetelés) a használatával biztosítjuk kétfázisú zár protokollt (2LP - Kétfázisú zárak), amely szerint az összes zár által egy tranzakció eltávolítják csak akkor, ha teljes. Tehát az ügylet végrehajtása két fázisra oszlik: (1) - a zárak felhalmozódása, (2) - a zárolások felszabadítása az elkövetés vagy a visszahúzás következtében.

Sajnos a blokkoló mechanizmus használata lassabb tranzakció-feldolgozást eredményez, mivel a rendszernek várnia kell, amíg a versenytárs tranzakció által rögzített adatok felszabadulnak. Ez a probléma megoldható a tranzakció által rögzített adatok töredékének csökkentésével. A rögzített objektumtól függően több lezárási szint is létezik.
  • az egész adatbázis blokkolva van - nyilvánvalóan ez az opció elfogadhatatlan, mivel csökkenti a többfelhasználós üzemmódot egyfelhasználós
  • külön táblák blokkolva vannak
  • az oldalak blokkolva vannak (oldal - a tábla egy töredéke általában 2-4 KB méretű, a rendszer által feldolgozott adatok memóriaelosztásának egysége)
  • a rekordok blokkolva vannak
  • külön mezők blokkolva vannak
A modern DBMS rendszerint rögzítheti a rekordok vagy oldalak szintjét.

Az SQL nyelv is biztosítja a tranzakciók sebességének közvetett ellenőrzését az ügylet elkülönítési szintjének meghatározásával. A tranzakció elkülönítési szintje alatt érthető, hogy a fenti hibahelyzetek egyike felmerülhet. Az SQL szabvány az elválasztás négy szintjét határozza meg:




Kapcsolódó cikkek