Professional Documents
Culture Documents
02.lock Contention
02.lock Contention
causes principals i
impacte en el rendiment
1
o mantenir un dependència durant un llarg temps. 3.1 Bloquejos DML a nivell de
També serveix per localitzar un objecte dins de la
library cache.
taula
S'implementen com enqueues del tipus TM i de
Aquest bloquejos són adquirits als gestor d’objectes,
següent manera: cada cursor manté una llista de
durant les crides d'anàlisis (parse). El mode en que
bloquejos de taula, la qual és construïda quan es fa
són adquirits és exclusiu en gestors parents i childs, i
l'anàlisi (parsing) de la sentència. Abans de la
compartit en totes les seves dependències. Aquest
primera execució del cursor , es crida a una funció
bloquejos son retinguts en NULL per detectar
per obtenir tots els bloquejos de la taula i s'alliberen
invalidacions i permeten no haver de localitzar el
automàticament quan la transacció finalitza.
gestor un altre cop.
L’estructura de recurs és el gestor d’objectes i és on
s’implementa el bloqueig, les estructures de bloqueig 3.2 Bloquejos DML a nivell de fila
són assignades dinàmicament des de la shared pool. A part d'assegurar la integritat de la definició de
Els tipus de bloqueig són: L[A] ... L[P]. l'objecte durant la transacció, la consistència de les
L'esdeveniment d'espera library cache lock indica dades també ha de ser protegida. Això
una espera en adquirir un bloqueig en la library s'aconsegueix per mitjà de la implementació de
cache. Les esperes en aquest cas són poc freqüents. bloquejos a nivell de fila i de transacció.
Els bloquejos a nivell de fila s'implementen per
2.3 Library cache pins mitjà d'un byte de bloqueig a cada capçalera de fila
i a la ITL (interested transaction list) de cada bloc
Library cache pins administren la coherència en de dades o índexs. Quan un fila és bloquejada, el
aquesta memòria cau. Clavar (pinning) un objecte fa byte de bloqueig apunta cap a l'entrada dins de la
que el heap sigui carregat dins de la memòria. Si ITL que te informació sobre si el bloqueig està
algú vol modificar o examinar l'objecte, primer ha actiu o no. De qualsevol manera, totes les entrades
d'adquirir un pin en el heap apropiat, després un ITL d'una transacció apunten a un enqueue TX que
bloqueig en el gestor associat. Una espera implica en última instància, determina si una transacció ha
que qualsevol altra sessió sosté el pin d'un mode finalitzat o no i per tant si els bloquejos de fila
incompatible. estan actius o no.
S'adquireix de manera compartida per llegir als S'implementen com un enqueue TX, els descriptors
heaps i prevenir modificacions als objectes ITL implementen els bloquejos de fila.
dependents. De manera exclusiva per modificar els
heaps.
En aquest cas el gestor d'objectes és l'estructura de
recurs que implementa el bloqueig. Els pins són
assignats des de la shared pool. Els tipus de bloqueig
són: N[A] ... N[Z].
L'esdeveniment d'espera library cache lock indica
esperes per adquirir a library cache pin, són poc
comunes.
3 Bloquejos DML
Els bloquejos DML garanteixen la consistència de Row level lock
les dades durant una transacció. Són necessaris per Al exemple es pot veure:
dos propòsits fonamentals:
La transacció 1 (Tx1) vol modificar les files 2 i 3:
• Els bloquejos de taula garanteixen la
consistència de la definició de l'objecte • Accedeix al bloc i assigna la entrada ITL1
durant el temps que duri la transacció. • Accedeix a les files per el rowid i verifica
• Els bloquejos de fila asseguren la que no estan bloquejades per altra
consistència de les dades durant la transacció transacció, per tant el camp de bloqueig
sencera. (segon byte) de la capçalera de la fila val 0.
2
• La transacció 1 bloqueja les 2 files no pot ser reclamat.
modificant el camp de bloqueig amb el valor
La contenció per ITL es manifesta per si mateixa
del corresponent index a la seva ITL, en
com una espera amb un enqueue TX en mode
aquest cas 1.
compartit.
El mateix passa amb la transacció 2 (Tx2), que vol
modificar un fila diferent de les que ha canviat la
Tx1, la fila 1. 3.4 Bloquejos de transacció
(transaction blocks)
És corresponen amb transaccions actives i estan
emmagatzemades a la taula de transaccions de la
capçalera del bloc dels segments de rollback. Els
identificadors de transacció dins de la ITL apunten
cap a la taula de transacció.
Aquest tipus de bloqueig s’implementa con un
enqueue TX.
Els identificadors de transacció (XID) identifiquen
un transacció única dins del sistema. S’utilitzen
dins de la ITL d’un bloc de dades o d'índex i
consisteix en:
Al segon exemple que veurem a continuació, la
transacció 2 (Tx2) vol modificar la fila 2. Al accedir
al la fila en el bloc, la transacció detecta que la fila
està bloquejada per un altre transacció (el camp de
bloqueig no és 0). Es tracta d'un conflicte ?
• Un nombre de segment de rollback/undo
Es fa una neteja (cleanout), eliminant la informació
de la transacció, per veure si la transacció 1 (Tx1) • Un nombre de slot dins de la taula de
ha fet commit. Si després encara està activa hi ha un transaccions
conflicte. La transacció 2 (Tx2) ha d'esperar a que la • Un nom de seqüència denominat wrap#
Transacció 1 (Tx1) alliberi el bloqueig en la fila i
això passarà quan la transacció 1 (Tx1) finalitzi
(commit o rollback) i s'ha realitzat d'una neteja de
blocs (block cleanut)
La transacció Tx2 espera com a resultat de la petició
del enqueue TX que està associat amb la transacció 1
(Tx1) de manera exclusiva. El mateix passa amb la
transacció 3 (Tx3) que vol modificar la fila 3.
3
de buffer. Aquestes capçaleres actuen com a d’undo.
estructures de recursos als bloquejos de buffer. Les
• Contenció als blocs d’undo: és provocada
sessions manipulen la capçaleres per mitjà dels
quan diverses sessions concurrents estan
gestors de buffer, que són unes estructures que
consultant dades i modificant-les al mateix
s’assignen dinàmicament i que actuen com
temps. Bàsicament les sessions que
estructures de bloquejos. Els bloquejos de buffer
consulten les dades estan lluitant per
poden ser adquirits de manera compartida o
imatges de lectures consistents dels blocs
exclusiva.
de dades.
Les capçaleres dels buffers implementen una llista
La contenció als blocs d’índex és similar a la
doblement enllaçada dels gestors de buffers per a les
contenció als blocs de dades però existeixen dos
sessions que estan utilitzant i altra per als que estan
excepcions:
esperant.
• Index block split: succeeix quan un bloc
Aquesta mena de bloquejos no s’implementen com
d’índex ha de ser redistribuït, en aquest
enqueues, s’implementen com estructures de
cas, no es permeten operacions mentre
bloqueig dins de la buffer cache. Les sessions que
s’està duent a terme la redistribució.
esperen per un bloqueig de buffer esperen en
l'esdeveniment d’espera buffer busy wait o write • Bitmap índex update: cada entrada cobreix
complete waits. un rang de rowids, si una sessió actualitza
una columna que forma part de l’índex,
l’entrada ha de ser actualitzada i aquesta
4.1 Buffer busy waits operació comprèn tres fases: descomprimir
Quan una sessió vol llegir o modificar un buffer a la el mapa de bits, modificar-lo i comprimir-
SGA adquireix el latch cache buffer chains i travessa lo un altre vegada. Es tracta d’una operació
la buffer chain fins trobar la capçalera del buffer molt costosa i durant el temps que dura
corresponent. Llavors ha d’adquirir un bloqueig a la l’operació cap altre sessió pot modificar
capçalera del buffer de manera exclusiva o una fila del mateix rang. Per això no són
compartida depenent de l’operació a realitzar. Una recomanables per sistemes OLTP.
vegada que s’ha bloquejat i s’ha fixat la sessió,
allibera el latch i realitza l’operació pertinent. Si la 4.2 Write complete waits
sessió no pot obtenir el bloqueig espera per buffer
busy waits. Es poden classificar segons el tipus de Quan un procés necessita modificar un buffer que
contenció: ha esta marcat com being writen espera per aquest
esdeveniment ja que no poden ser modificats fins
• Contenció al blocs de dades: té lloc quan hi
que hagin estat portats a disc i els seus flags
ha diverses sessions realitzant operacions
netejats.
DML al mateix objecte al mateix moment o
per que diverses consultes accedeixen als
mateixos blocs. Depenent de la versió de 5 Cas d'estudi: ITL i taula de
base de dades, aquest últim supòsit ha de
donar lloc a un nou esdeveniment d’espera transaccions
anomenat read by another session. En aquest cas d'estudi analitzarem com és la ITL i
• Contenció a les capçaleres dels segments de una taula de transaccions.
dades: té lloc quan algunes taules o índexs Disposem d'una taula anomena còmics on tenim
tenen una activitat molt alta a les capçaleres emmagatzemats una serie de còmics, el seu
de segment. Un procés visita una capçalera contingut és el següent:
per obtenir o modificar les FREELIST i
ID NOM
estendre la marca d’aigua (HWM). Cada
segment té una o més freelist a la capçalera ---------- ------------
del segment per realitzar un seguiment dels 1 watchmen
blocs de dades per sota de la marca d’aigua.
2 dark knight
• Contenció a les capçaleres de segment 3 maus
d’undo: és causada per freqüents
actualitzacions a les capçaleres de segment 4 tintin
4
El que farem serà actualitzar la quarta fila, recent generat per la transacció.
canviarem el nom de tintin pel de blake i mortimer
4. identifica l'estat de la transacció. C---
però no finalitzarem la transacció. Aquest és el
indica que la transacció ha estat
aspecte del bloc una vegada feta l'actualització:
confirmada i netejada. El valor ---- indica
block_row_dump: que la transacció està activa.
tab 0, row 0, @0x1f79 5. lck: és el nombre de files bloquejades per
tl: 15 fb: --H-FL-- lb: 0x0 cc: 2 la transacció en el bloc.
col 0: [ 2] c1 02 6. scn/fsc: pot indicar el scn o el nombre de
col 1: [ 8] 77 61 74 63 68 6d 65 6e bytes d'espai lliure que haurà disponibles si
tab 0, row 1, @0x1f67
la transacció confirma.
tl: 18 fb: --H-FL-- lb: 0x0 cc: 2 Si relacionem el bloc amb la ITL veurem que el
efectivament el lock byte del bloc és la posició que
col 0: [ 2] c1 03
ocupa la transacció en la llista (0x3). També
col 1: [11] 64 61 72 6b 20 6b 6e 69 67 68 74 s'observa que el flag de la transacció 0x03 és ---.
tab 0, row 2, @0x1f5c Això indica que la transacció no ha finalitzat i
tl: 11 fb: --H-FL-- lb: 0x0 cc: 2 encara està activa i que té una fila bloquejada
(lck=1).
col 0: [ 2] c1 04
D'altra banda la informació que ens proporciona el
col 1: [ 4] 6d 61 75 73
camp uba ens servirà per identifica la transacció
tab 0, row 3, @0x1e83 dins de la taula de transaccions del registre d'undo:
tl: 25 fb: --H-FL-- lb: 0x3 cc: 2 index state cflags wrap# uel scn dba
col 0: [ 2] c1 05 0x00 9 0x00 0x04c0 0x001d 0x0000.002dba60 0x00c00103
tl: 16 fb: --H-FL-- lb: 0x0 cc: 2 0x04 9 0x00 0x04c0 0x000b 0x0000.002dbbe3 0x00c00104
1. itl: és el index que ocupa dins del array. És 0x14 9 0x00 0x04c0 0x0006 0x0000.002dbe67 0x00c00105
el valor que utilitza el lock byte del bloc per 0x15 9 0x00 0x04c0 0x0013 0x0000.002dbd34 0x00c00105
mostrar quina transacció ha bloquejat la fila. 0x16 9 0x00 0x04c0 0x0020 0x0000.002dbdad 0x00c00105
2. xid: és l'identificador de la transacció que ha 0x17 9 0x00 0x04bf 0x000e 0x0000.002dbd15 0x00c00105
modificat el bloc. El seu format és segment 0x18 9 0x00 0x04bf 0x000c 0x0000.002dbb07 0x00c00104
+ undo slot + undo sequence number. 0x19 9 0x00 0x04bf 0x001f 0x0000.002dbb95 0x00c00104
3. uba: és l'adreça del registre d'undo del més 0x1a 9 0x00 0x04bf 0x000d 0x0000.002dbc43 0x00c00104
5
0x1b 9 0x00 0x04be 0x0003 0x0000.002dba87 0x00c00103