Adatbázisok szerver oldali programozása Előadás, 2006.04.07.

A VIK Wikiből

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>


<< Előadás, 2006.04.07. >>

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.