Adatbázisok szerver oldali programozása Előadás, 2006.04.07.
Ez az oldal a korábbi SCH wikiről lett áthozva.
Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor, kérlek, javíts rajta egy rövid szerkesztéssel!
Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót.
<style> code.pre { white-space: pre; display: block; mergin-top: 2px; margin-bottom: 2px;} li { line-height: 18px; } </style>
Tranzakciók
Definíció
Tranzakciónak hívjuk a munka 1 logikai egységét. 1 tranzakció 1 vagy több SQL utasításból állhat.
Tranzakció tulajdonságai (ACID) — gyakori vizsgakérdés:
- atomicity: vagy minden utasítása végrehajtódik, vagy egyik sem
- consistency: a tranzakció konzisztens állapotból konzisztens állapotba visz
- isolation: a tranzakció elvárt eredménye megegyezik azzal, mintha a tranzakció egyedül futna
- durability: véglegesítés után nem veszhet el az információ
Tranzakció határai
- kezdete: 1 futtatható SQL utasítás
- vége:
- explicit =COMMIT= vagy =ROLLBACK=
- implicit: DDL utasítás (=CREATE=, =DROP=, =RENAME=, =ALTER=) kiadásával vagy a kapcsolat bezárásával automatikusan commitol. A DDL utasítás mindenképp külön tranzakcióban fut.
- implicit =ROLLBACK=: ha az adatbázis kapcsolat hiba köveztében szakad meg
COMMIT
- véglegesítés
- a változtatások a többiek számára is láthatóvá válnak
- zárak felszabadítása
- az adat lemezre kerül
- naplózás
ROLLBACK
- visszafejti az utasításokat a tranzakció kezdetéig
- Oracle megoldása a visszafejtésre: redo log, azaz minden utasítás végrehajtásakor letárolja az utasítás inverzét is
- a tranzakcióban definiálhatók biztonsági pontok (=SAVEPOINT=): a tranzakció nem csak a legelejére görgethető vissza, hanem egy biztonsági pontig is
- =SAVEPOINT= definiálása: =SAVEPOINT s.p. neve;=
- visszagörgetés: =ROLLBACK TO s.p. neve;=
- ha azonos néven definiálunk 2 savepointot, az utolsó felülírja a többit
- rekurzív függvényben a
SAVEPOINT
-ok a stacken tárolódnak, de csak a legbelső érhető el - az utasítás szintű visszafejtést az Oracle implicit
SAVEPOINT
-ok segítségével végzi
Konkurens tranzakciók
Konkurens tranzakciók esetén a következő problémák merülhetnek fel:
- _dirty read_: a tranzakció olyan adatot olvas, amit egy másik nem kommittáltan írt
- _nem megismételhető olvasás_: az adathalmazt újra beolvasva azt látjuk, hogy egy már kommittált tranzakció módosította vagy törölt belőle
- _fantom olvasás_: olvasás közben egy másik tranzakció új sorokat szúr be
A problémák megoldására az SQL'92 szabvány 4 izolációs szintet különít el. A táblázat mezői azt jelentik, hogy adott izolációs szinten adott hiba előfordulhat-e.
Dirty read | Non-repeatable read | Phantom read | |
Read uncommitted | igen | igen | igen |
Read committed | nem | igen | igen |
Repeatable read | nem | nem | igen |
Serializable | nem | nem | nem |
Az Oracle 3 izolációs szintet vezetett be:
- read committed: alapbeállítás
- a tranzakciók olyan adatokat látnak, amiket a lekérdezés előtt kommittáltak
- akkor érdemes használni, ha kevés ütközésre számítunk
- serializable
- a tranzakciók olyan módosításokat adatokat látnak, amiket a tranzakció kezdete előtt kommittáltak
- nagy adatbázis, várhatóan kevés ütközés (2 tranzakció azonos sort próbál módosítani), rövid, kevés sort érintő módosító tranzakciók esetén érdemes használni
- read only
- a tranzakciók olyan módosításokat adatokat látnak, amiket a tranzakció kezdete előtt kommittáltak
- a tranzakció csak olvashat
Példa
Zárak kezelése
Sor szintű zárak
Sor szintű zárak kurzorral
Tábla szintű zárolás
Autonóm tranzakció
-- Peti - 2006.04.10.