Mi az a tranzakció?
A relációs adatbáziskezelők rendelkeznek 4 alaptulajdonsággal a tranzakciókezelésnél, ami nélkül nem lennének az, amik.
A tranzakció röviden olyan műveletek összessége, amik „egyszerre” hajtódnak végre. Egy munkaegység, angolul (Logical) Unit of Work – néhol LuW a neve. Például amikor kiveszünk pénzt a bankszámlánkról, az egy tranzakciónak számít. Igazából ilyenkor nem egy adatbázisművelet történik egyhuzamban, hanem több. A példánál maradva a tranzakciónk (elképzelt/lehetséges) lépései a következők:
- Számlaszám kiválasztása (SELECT)
- Ellenőrzés, hogy van elég pénz a számlán a pénzfelvételhez (SELECT)
- Számlaszámon lévő összeg átírása (UPDATE)
- Egyéb helyen felvétel rögzítése (UPDATE/INSERT)
- Adatbázisműveletek jóváhagyása (COMMIT)
Mind az öt lépés jelenti a tranzakciót, ami alapján most egy-egy adatbázis tulajdonságot bemutatunk.
Atomiság / Atomicity
Az atomiség azt jelenti, hogy a tranzakció összes lépést vagy végrehajtjuk, vagy nem. Amennyiben akár egy lépésnél is hiba lép fel, úgy az egész tranzakció visszavonódik (ROLLBACK).
Például az adatbázisszervert futtató gép újraindul áramszünet miatt, mikor az éppen folyamatban lévő pénzfelvételünk a hármas pontnál tartott. Ezesetben a rendszer újraindulása után a pénzfelvétel trnazakciója még nem látható, az adatok úgy néznek ki, mintha el sem kezdődött volna az.
Konzisztencia / Consistency
Izoláció / Isolation
Az izolációs szintek adják meg, hogy az egyes tranzakciók mit látnak a (többnyire) párhuzamosan futó tranzakciók által manipulált adatokon. Magyarul mi történik akkor, ha az éppen egy tranzakció által használt (SELECT/UPDATE/INSERT/DELETE) adatokkal egy vagy több másik tranzakció is műveleteket akar végezni. Többféle, igen érdekes megoldást alkalmaznak a piacon elérhető adatbáziskezelő rendszerek. Maga a probléma a szoftverfejlesztés egyik legérdekesebb problémája.
Olvasási probléma 1. Dirty Read
Az angolul csak read phenomena-ként hívott problémák egész sorát mutatjuk most be. Ez a probléma olyankor lép fel, amikor egy tranzakció olvas egy olyan értéket, amit éppen egy másik tranzakció már kiírt az adatbázisba, de még nem COMMITolt.
PID | Mennyiség | Ár |
---|---|---|
1 | 15 | 100 HUF |
2 | 20 | 80 HUF |
Tranzakció 1:
1.1. SELECT PID, Mennyiség*Ár FROM TÁBLA
1.2. SELECT SUM(Mennyiség*Ár) FROM TÁBLA
Tranzakció 2:
2.1. UPDATE TÁBLA SET Mennyiség = Mennyiség + 10 WHERE PID = 1
Az első tranzakció 1.1. lépése végrehajtódott, a második tranzakció első lépése is, de a 2.1. után még nem történt COMMIT, mielőtt az 1.2. végrehajtódik. Ekkor az 1.2. eredménye nem lesz helyes ebben az esetben (3100 helyett 4100).
Ebben az esetben a program dolga eldönteni, hogy ez helyes-e így.
Olvasási probléma 2. Non-repeatable Read
PID | Mennyiség | Ár |
---|---|---|
1 | 15 | 100 HUF |
2 | 20 | 80 HUF |
Tranzakció 1:
1.1. SELECT PID, Mennyiség*Ár FROM TÁBLA
1.2. SELECT SUM(Mennyiség*Ár) FROM TÁBLA
Tranzakció 2:
2.1. UPDATE TÁBLA SET Mennyiség = Mennyiség + 10 WHERE PID = 1
2.2. COMMIT
A végrehajtási sorrend itt most: 1.1. majd 2.1. majd 2.2. majd 1.2. Ebben az esetben nem beszélhetünk Dirty Read-ről, mivel az érték a második tranzakcióban jóváhagyásra került már (COMMIT). Mégis kérdéses, hogy ez az erték most akkor rendben van-e így?
Olvasási probléma 3. Phantom Read
PID | Mennyiség | Ár |
---|---|---|
1 | 15 | 100 HUF |
2 | 20 | 80 HUF |
3 | 25 | 120 HUF |
Tranzakció 1:
1.1. SELECT PID, Mennyiség*Ár FROM TÁBLA
1.2. SELECT SUM(Mennyiség*Ár) FROM TÁBLA
Tranzakció 2:
2.1. INSERT INTO TÁBLA VALUES ('3',25,120)
2.2. COMMIT
A sorrend: 1.1. majd 2.1. majd 2.2. majd 1.2.
Ekkor az első tranzakció második olvasása eltérő eredményt ad, mint amit vártunk, hiszen az újonnan beszúrt sor (2.1. és 2.2.) értékeivel is számolunk.
Vajon helyesen?
Izolációs szintek
Nem Jóváhagyott Olvasás – Read Uncommitted
Nincs izoláció a tranzakciók között, bármilyen külső tranzakció megváltoztathajta amit egy tranzakció lát.
Jóváhagyott Olvasás – Read Committed
Csak jóváhagyott (committed) dolgokat olvas a tranzakció, ha kívülről valami megváltoztat egy értéket. Menet közben változhat itt egy rekord értéke.
Ismételt Olvasás – Repeateble Read
Csak az adott tranzakció futása előtt jóváhagyott (committed) rekordokkal dolgozik a tranzakció. Ami menet közben változna meg, azt már hiába hagyja jóvá külső elem, nem lesz figyelembe véve. Gyakran alkalmaznak ebben az esetben verziózást vagy zárakat (locking mechanism) rekordokra.
Tranzakciók Sorbarendezése – Serializable (transactions)
Minden tranzakció egységként fut le, egymás után, nincs párhuzamos végrehajtás. Értelemszerűen ez a leglassabb, de legbiztosabb megoldása a párhuzamos hozzáférésnek.
A különböző izolációs szintek különböző problémákat oldanak meg. Lássuk csak a Wikipedia-n található képet:
Tartósság / Durability
Amennyiben szeretne a témában tanulni, megoldásra van szüksége, üzemeltetési problémája van vagy egyedi informatikai témában segítségre van szüksége, keressen fel.
Képek: