Skip to content

Relációs adatbázisok tranzakciókezelése (ACID)

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:

  1. Számlaszám kiválasztása (SELECT)
  2. Ellenőrzés, hogy van elég pénz a számlán a pénzfelvételhez (SELECT)
  3. Számlaszámon lévő összeg átírása (UPDATE)
  4. Egyéb helyen felvétel rögzítése (UPDATE/INSERT)
  5. 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.

PIDMennyiségÁr
115100 HUF
22080 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

PIDMennyiségÁr
115100 HUF
22080 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

PIDMennyiségÁr
115100 HUF
22080 HUF
325120 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:

Problémák és a megoldásuk - Izolációs szintek

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: