Zárolások (Lock) az Oracle rendszerben --------------------------------------- A zárolásokkal kapcsolatos fontos fogalmak a következők: Mi a zárolt objektum (sor vagy tábla) A zárolás módja (kizárólagos vagy megosztott) Minél kisebb objektumot képes zárolni egy rendszer, annál nagyobb konkurrenciát enged meg, viszont annál több adminisztrációra van szüksége a zárolások nyilvántartásához. Problémák a zárolással kapcsolatban: Holtpont (amikor két vagy több tranzakció egymásra vár) A holtponttal kapcsolatban kétféle szokásos stratégia létezik: 1. A holtpont megelőzése (ez költséges és nehézkes) 2. A holtpont felismerése és megszüntetése. (Ezt alkalmazza az oracle is) Zárak tovagyűrűzése (lock escalation) Amikor pl. egy tábla több sorára is sor szintű zárolás érvényes, és a rendszer egy határ után az egész táblára vonatkozó zárolássá alakítja át a sor szintű zárakat. Ez nagyban megnöveli a holtpont esélyét. Az oracle soha nem alkalmazza ezt a módszert. (Más adatbáziskezelők igen) A zárolással kapcsolatos legfontosabb szempontok az Oracle esetében: * Automatikus sor szintű zárolást alkalmaz a rendszer. * Lehetőség van manuális zárolásra is. * Az olvasások nem zárolják az adatokat semmilyen módon. * Az olvasásoknak soha nem kell várakozniuk az író utasítások miatt. * Az író utasításoknak soha nem kell várakozniuk az olvasó utasítások miatt. * Az író utasítások csak akkor várakoznak más író utasításra, ha ugyanazt a sort érinti a két utasítás. * A kialakított zárolások a tranzakció végéig élnek. (Rollback vagy Commit) * Egy SAVEPOINT után megszerzett zárolások a savepointig való rollback-elés esetén felszabadulnak. Zárolási típusok az oracle-ben: DML lock (sor vagy tábla szintű, az adatokat védi) DDL lock (az objektum szerkezetét és definícióját védi, részletesebben lásd később) Belső lock és latch (a rendszer belső adatstruktúráit védi, pl. SGA-t, adatszótárat) Elosztott zárak (párhuzamos szerver esetén az instanciák közötti védelmet biztosítja) Az oracle automatikusan sor szintű zárat helyez el az érintett sorokra a következő utasítások esetén: INSERT, DELETE, UPDATE, SELECT ... FOR UPDATE Ezek a zárak a tranzakció végéig élnek. A sor szintű zárakon kívül az oracle automatikusan tábla szintű zárat is elhelyez az érintett táblákra a fenti utasítások esetén. (Az első 3 utasítás esetén RX, az utolsó utasítás esetén RS zárat. lásd alább) Tábla szintű zárat a fentieken kívül még a LOCK TABLE utasítás hatására helyez el az oracle. Összesen ötféle tábla szintű zárat támogat a rendszer, amelyeket a LOCK TABLE utasítás megfelelő paraméterezésével manuálisan lehet kiváltani. A zárójelben megadtuk azt a számértéket is, ahogyan a rendszerkatalógusban a zárolási mód tárolva van. (V$LOCK tábla lmode oszlopa) A korábbi verziókkal való kompatibilitás miatt van még egy SHARE UPDATE mód is, ami a ROW SHARE szinonimája. (RS -> 2) LOCK TABLE IN ROW SHARE MODE (RX -> 3) LOCK TABLE IN ROW EXCLUSIVE MODE (S -> 4) LOCK TABLE IN SHARE MODE (SRX -> 5) LOCK TABLE IN SHARE ROW EXCLUSIVE MODE (X ->6) LOCK TABLE IN EXCLUSIVE MODE A zárolási módok jelentése nagyjából a következő: RS Későbbi módosítási szándék jelzése, vagyis ne sajátítsa ki senki a táblát. RX Néhány sort módosítok éppen. S A táblát most egy darabig ne módosítsa senki, de olvashatja más is. SRX Ne módosítson senki, én viszont épp azt teszem. X Mindenki felejtse el a tábla módosítását, legfeljebb olvashatjátok azt. A LOCK TABLE és a SELECT ... FOR UPDATE utasítás esetén megadható a NOWAIT, ez esetben nem vár a rendszer arra, hogy a zárolás sikerüljön. Ha nem sikerült azonnal, akkor az ORA-00054: hibával hal el az utasítás. Melyik session milyen zárolást tart fenn jelen pillanatban? SELECT ... FROM v$lock lo, v$session se WHERE se.sid = lo.sid AND username is not null SID USERNAME TY LMODE ---------- ------------------------------ -- ---------- 7 NIKOVITS TM 3 7 NIKOVITS TX 6 A sor lock a TX, a tábla lock a TM. Melyik session vár éppen egy zárolásra, melyik sessionra várnak éppen, és milyen régen? SELECT ... FROM v$lock lo, v$session se WHERE se.sid = lo.sid AND username is not null SID USERNAME TY LMODE REQUEST CTIME BLOCK --------- ---------- -- --------- --------- --------- --------- 16 NIKOVITS TM 3 0 4499 0 16 NIKOVITS TX 6 0 4499 1 29 NIKOVITS TX 0 6 186 0 29 NIKOVITS TM 3 0 186 0 Mely objektumokat tartja zárolás alatt valamelyik session jelen pillanatban? SELECT ... FROM v$locked_object lo, dba_objects db WHERE lo.object_id = db.object_id ORACLE_USERNAME SESSION_ID LOCKED_MODE OBJECT_NAME OBJECT_TYPE ----------------- ---------- ----------- ------------ ------------- NIKOVITS 7 3 PROBA TABLE DDL zárak Azért szükségesek, hogy pl. egyszerre többen ne módosítsák a tábla szerkezetét, vagy ne módosuljon a tábla, amíg egy rá hivatkozó procedúrát éppen fordít a rendszer. Több típusa van a DDL záraknak, ezek a következők: Exclusive DDL zár Pl. egy ALTER TABLE utasításnak ilyenre van igénye Megosztott DDL zár Pl. egy CREATE PROCEDURE utasításnak elég ez is a hivatkozott táblákra vonatkozóan. Eldobható elemzési zárak A Shared Poolban levő SQL utasítások és PL/SQL programok ilyen zárat tartanak fenn a hivatkozott objektumaikra vonatkozóan. Ezt a rendszer eldobhatja ha közben módosul az objektum és az adott SQL utasítás ilyenkor INVALID állapotba kerül, vagyis a rendszer tudja, hogy legközelebb újra kell fordítania.