az oracle sql 12

25
2006. november 7 . Markó Tamás, PTE TTK 1 Az Oracle SQL 12. Tranzakciókezelés

Upload: zenda

Post on 12-Jan-2016

85 views

Category:

Documents


0 download

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 Presentation

TRANSCRIPT

Page 1: Az  Oracle  SQL 12

2006. november 7. Markó Tamás, PTE TTK 1

Az Oracle SQL 12.

Tranzakciókezelés

Page 2: Az  Oracle  SQL 12

2006. november 7. Markó Tamás, PTE TTK 2

A rádiótelefonokat kérem

KIKAPCSOLNI!

Page 3: Az  Oracle  SQL 12

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)

Page 4: Az  Oracle  SQL 12

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

Page 5: Az  Oracle  SQL 12

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

Page 6: Az  Oracle  SQL 12

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)

Page 7: Az  Oracle  SQL 12

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

Page 8: Az  Oracle  SQL 12

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

Page 9: Az  Oracle  SQL 12

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

Page 10: Az  Oracle  SQL 12

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

Page 11: Az  Oracle  SQL 12

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ű

Page 12: Az  Oracle  SQL 12

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

Page 13: Az  Oracle  SQL 12

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

Page 14: Az  Oracle  SQL 12

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ő

Page 15: Az  Oracle  SQL 12

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

Page 16: Az  Oracle  SQL 12

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;

Page 17: Az  Oracle  SQL 12

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

Page 18: Az  Oracle  SQL 12

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ú

Page 19: Az  Oracle  SQL 12

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

Page 20: Az  Oracle  SQL 12

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

Page 21: Az  Oracle  SQL 12

2006. november 7. Markó Tamás, PTE TTK 21

Tranzakciók osztott adatbázisban

Page 22: Az  Oracle  SQL 12

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

Page 23: Az  Oracle  SQL 12

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

Page 24: Az  Oracle  SQL 12

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

Page 25: Az  Oracle  SQL 12

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 ...