az oracle sql 12
DESCRIPTION
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. - PowerPoint PPT PresentationTRANSCRIPT
2006. november 7. Markó Tamás, PTE TTK 1
Az Oracle SQL 12.
Tranzakciókezelés
2006. november 7. Markó Tamás, PTE TTK 2
A rádiótelefonokat kérem
KIKAPCSOLNI!
2006. november 7. Markó Tamás, PTE TTK 3
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)
2006. november 7. Markó Tamás, PTE TTK 4
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
2006. november 7. Markó Tamás, PTE TTK 5
Példa tranzakcióra: banki átutalás
• UPDATE szamla SET egyenleg = egyenleg - 50 000WHERE szlaszam=‘11223344-55667788’;
• UPDATE szamla SET egyenleg = egyenleg + 50 000WHERE szlaszam=‘11112222-5555666’;
• INSERT INTO naplo VALUES (SYSDATE, ‘átutalás’,‘11223344-55667788’, ‘11112222-5555666’,50 000);
az egyik számla egyenlegének csökkentése
a másik számla egyenlegének növelése
a műveletnaplózása
2006. november 7. Markó Tamás, PTE TTK 6
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)
2006. november 7. Markó Tamás, PTE TTK 7
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
2006. november 7. Markó Tamás, PTE TTK 8
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ítottlekérdezés az újabb
módosításokat nem látja
2006. november 7. Markó Tamás, PTE TTK 9
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
2006. november 7. Markó Tamás, PTE TTK 10
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
2006. november 7. Markó Tamás, PTE TTK 11
A mentési pont használata
• 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 mentési hely neve
a két forma egyenértékű
2006. november 7. Markó Tamás, PTE TTK 12
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
2006. november 7. Markó Tamás, PTE TTK 13
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
2006. november 7. Markó Tamás, PTE TTK 14
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ő
2006. november 7. Markó Tamás, PTE TTK 15
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
2006. november 7. Markó Tamás, PTE TTK 16
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;
2006. november 7. Markó Tamás, PTE TTK 17
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
2006. november 7. Markó Tamás, PTE TTK 18
Az SQL*Plus és a tranzakciók 2.
• 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
a két formaegyenrangú
2006. november 7. Markó Tamás, PTE TTK 19
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
2006. november 7. Markó Tamás, PTE TTK 20
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
2006. november 7. Markó Tamás, PTE TTK 21
Tranzakciók osztott adatbázisban
2006. november 7. Markó Tamás, PTE TTK 22
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
2006. november 7. Markó Tamás, PTE TTK 23
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
2006. november 7. Markó Tamás, PTE TTK 24
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
2006. november 7. Markó Tamás, PTE TTK 25
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 ...