280 likes | 476 Views
Az Oracle SQL 12. Tranzakciókezelés. A rádiótelefonokat kérem KIKAPCSOLNI!. Olvasnivaló. Gyári dokumentáció: Oracle 9i Database Concepts (16. fejezet) Oracle 9i Application Developer’s Guide - Fundamentals (7. fejezet) PL/SQL User’s Guide and Reference (6. fejezet). A tranzakció fogalma.
E N D
Az Oracle SQL 12. Tranzakciókezelés Markó Tamás, PTE TTK
A rádiótelefonokat kérem KIKAPCSOLNI! Markó Tamás, PTE TTK
Olvasnivaló • Gyári dokumentáció: • Oracle 9i Database Concepts (16. fejezet) • Oracle 9i Application Developer’s Guide - Fundamentals (7. fejezet) • PL/SQL User’s Guide and Reference (6. fejezet) Markó Tamás, PTE TTK
A tranzakció fogalma • Az adatfeldolgozás logikai egysége • Egy vagy több DML utasításból áll • Az adatbázis csak az összes utasítás végrehajtása után kerül újra konzisztens állapotba • Egy tranzakció vagy mindegyik utasítását végre kell hajtani, vagy a már elvégzetteket vissza kell görgetni Markó Tamás, PTE TTK
Példa tranzakcióra: banki átutalás az egyik számla egyenlegének csökkentése • UPDATE szamla SET egyenleg = egyenleg - 50 000 WHERE szlaszam=‘11223344-55667788’; • UPDATE szamla SET egyenleg = egyenleg + 50 000 WHERE szlaszam=‘11112222-5555666’; • INSERT INTO naplo VALUES ( SYSDATE, ‘átutalás’, ‘11223344-55667788’, ‘11112222-5555666’, 50 000); a másik számla egyenlegének növelése a művelet naplózása Markó Tamás, PTE TTK
Tranzakciókezelő utasítások • COMMIT; • véglegesíti a tranzakció során elvégzett adatmódosításokat • a módosítások a többi felhasználó számára is láthatóvá válnak • ROLLBACK; • visszagörgeti (meg nem történtté teszi) a tranzakció során elvégzett adatmódosításokat • Mindkettő lezárja a tranzakciót (és ezután új tranzakció kezdődik) Markó Tamás, PTE TTK
A tranzakciók implicit lezárása • Implicit COMMIT hajtódik végre, ha egy DDL (adatdefiníciós, pl. CREATE TABLE) vagy DCL (adatbiztonsági, pl. GRANT) utasítást adunk ki • Implicit COMMIT hajtódik végre, ha a felhasználó kilép az adatbázisból (pl. a módosításokat végző alkalmazás normál befejeződésekor) • Implicit ROLLBACK hajtódik végre, ha a módosításokat végző alkalmazás rendellenesen fejeződik be Markó Tamás, PTE TTK
Az adatbázis állapota lezáratlan tranzakciónál • A tranzakciót megkezdő felhasználó már az új - bár még nem végleges - adatokat látja • Mindenki más a tranzakció kiindulási állapotát látja • Más adatbáziskezelők más megoldást alkalmazhatnak az ilyen helyzet kezelésére system change number, a tranzakciót azonosítja adott SCN-nel indított lekérdezés az újabb módosításokat nem látja Markó Tamás, PTE TTK
A rollback szegmens • Átmeneti tárolóterület • Tranzakció közben a régi (ebben a tranzakcióban módosított) adatok itt tárolódnak • A tranzakció lezárásakor ez az adatterület törlődik, mindenki az adatbázis új állapotát látja Markó Tamás, PTE TTK
A mentési pont (savepoint) fogalma • „Mentési pont”: tranzakció közben létrehozható, egy köztes állapotot azonosító „könyvjelző” • A rollback történhet csak egy meghatározott mentési pontig is • Előnye: hosszú tranzakció közben elkövetett hiba miatt nem kell mindent visszagörgetni Markó Tamás, PTE TTK
A mentési pont használata a mentési hely neve • Létrehozás pl.SAVEPOINT osztondij_feldolg; • Visszagörgetés adott mentési pontig pl.ROLLBACK TO SAVEPOINT osztondij_feldolg;ROLLBACK TO osztondij_feldolg; • A folyó tranzakción belül bármelyik mentési pontig vissza lehet görgetni a két forma egyenértékű Markó Tamás, PTE TTK
Utasítás-szintű ROLLBACK • Egy SQL utasítás sosem hajtódik részlegesen végre: • vagy teljes egészében befejeződik • vagy visszaáll az adatbázis az utasítás kiadása előtti állapotra (utasítás-szintű visszagörgetés) • az utasítások kezdetekor egy implicit mentési pontot hoz létre a rendszer • Ez a mechanizmus teljesen automatikus • Az utasítás-szintű visszagörgetés nem érinti • a korábbi utasítások hatását • a folyamatban lévő tranzakciót Markó Tamás, PTE TTK
Egyidejű tranzakciók lehetséges problémái az SQL92 szerint • Dirty read: • a tranzakció olyan adatokat olvas, amit másik, még nem lezárt tranzakciók írtak • Nonrepeatable (fuzzy) read: • a tranzakció újra olvas korábban már olvasott adatokat, és azt látja, hogy azokat egy másik - már befejezett - tranzakció módosította vagy törölte • Phantom read: • a tranzakció újra olvas korábban már olvasott adatokat, és azt látja, hogy azokba egy másik - már befejezett - tranzakció új sorokat szúrt be Markó Tamás, PTE TTK
A problémák és az Oracle9i • Dirty read: • nem fordulhat elő • Nonrepeatable (fuzzy) read,Phantom read: • alaphelyzetben előfordulhat • be lehet állítani olyan üzemmódot is, hogy ne fordulhasson elő Markó Tamás, PTE TTK
A dirty read elkerülése • A veszélyes szituáció: az egyik felhasználó módosítja, ezzel egyidőben a másik olvassa ugyanazokat az adatokat • Az olvasás befejezéséig a rendszer elmenti az adatok kiindulási állapotát Markó Tamás, PTE TTK
Csak olvasható tranzakció • A „nonrepeatable read” hiba elkerülésére • Az egész tranzakcióban azt az állapotát olvashatjuk az adatbázisnak, amiben a tranzakció kezdetekor volt • Ilyen tranzakcióban nem lehet INSERT, UPDATE, DELETE • Ehhez a tranzakció első utasítása:SET TRANSACTION READ ONLY; Markó Tamás, PTE TTK
Az SQL*Plus és a tranzakciók 1. • Az SQL*Plus kilépéskor egy implicit COMMIT-tel lezárja a függőben lévő tranzakciót • EXIT ROLLBACK (QUIT ROLLBACK) hatására a függőben lévő tranzakció hatása visszagörgetődik • Az AUTOCOMMIT változóval beállítható az is, hogy az SQL*Plus munka közben automatikusan adjon ki COMMIT utasítást Markó Tamás, PTE TTK
Az SQL*Plus és a tranzakciók 2. a két forma egyenrangú • SET AUTOCOMMIT ON;SET AUTOCOMMIT IMMEDIATE; • az SQL*Plus minden DML utasítás után automatikusan elküld egy COMMIT utasítást az adatbázisnak • SET AUTOCOMMIT 10; • e parancs hatására 10 db DML utasítás után az SQL*Plus automatikusan egy COMMIT utasítást is elküld az adatbázisnak Markó Tamás, PTE TTK
Az SQL*Plus és a tranzakciók 3. • SET AUTOCOMMIT OFF; • kikapcsolja a COMMIT utasítás automatikus kiadását • SHOW AUTOCOMMIT; • kiírja a képernyőre az AUTOCOMMIT változó pillanatnyi értékét Markó Tamás, PTE TTK
Az SQL Developer és a tranzakciók • Tools menü / Preferences / Database Connections / Autocommit in SQL Worksheet: • ha be van kapcsolva, minden INSERT, UPDATE, DELETE után automatikusan COMMIT-et is végrehajt Markó Tamás, PTE TTK
Tranzakciók osztott adatbázisban Markó Tamás, PTE TTK
Osztott tranzakciók • Osztott adatbázis: adatbázisok hálózata • külön kiszolgálón működnek • együtt használjuk őket • Osztott adatbázisokban az adatmódosítás (szintaktikailag) a szokásos módon történik • a tényleges feldolgozás különböző gépeken történik • Osztott tranzakció: osztott adatbázisban végrehajtott tranzakció • több helyen kell véglegesíteni vagy visszagörgetni Markó Tamás, PTE TTK
A kétfázisú COMMIT 1. fázisa • Van egy koordinátor, ez mindenkinek üzenetet küld a véglegesítés szándékáról • Ha a munkaállomás kész a véglegesítésre, akkor • a módosítások előzetesen véglegesített állapotba kerülnek • üzenetet küld a koordinátornak a felkészülésről • Ha a munkaállomás visszagörgetni akar, akkor • üzenetet küld a koordinátornak a szándékáról Markó Tamás, PTE TTK
A kétfázisú COMMIT 2. fázisa • Mindenkitől megérkezik az üzenet a koordinátorhoz • Ha mindenki egyetért a véglegesítéssel • a koordinátor kiküldi a „véglegesítés” üzenetet • a munkaállomások végrehajtják a véglegesítést • Ha legalább egy munkaállomás visszagörgetni akar • a koordinátor kiküldi a „visszagörgetés” üzenetet • a munkaállomások végrehajtják a visszagörgetést Markó Tamás, PTE TTK
A tranzakció kétséges állapota • Az egyik munkaállomásról nem érkezik válasz a koordinátor üzenetére • Ilyenkor az elosztott tranzakció állapota kétséges, bizonytalan • Bizonytalan állapotú tranzakció „kézi” lezárása: • COMMIT FORCE ... • ROLLBACK FORCE ... Markó Tamás, PTE TTK