Académique Documents
Professionnel Documents
Culture Documents
Pgina 1 de 5
Creando el bloqueo
Usar la tabla emp del esquema SCOTT. Abro una sesin de SQL*Plus y configuro los siguiente
parmetros
SQL> set sqlprompt "SESION1> "
SESION1> set linesize 200
actualizo todos los registros
SESION1> update emp
2 set sal=1000*1.05;
14 rows updated.
[]
http://sartigas.blogspot.com.es/2009/07/quien-bloqueo-mi-sesion.html
26/09/2015
0E3CBE90 0E3CBEC0
27CF5D14 27CF5D54
137 TM 69948
0
137 TX 196639 3891
Pgina 2 de 5
0
6
570
570
0
1
observa la ltima columna BLOCK, si una sesin mantiene un bloqueo que a su vez bloquea a otra vers
que BLOCK=1. Llendo ms all, puedes ver cul sesin es la que est siendo bloqueada comparando
ID1 e ID2. La sesin bloqueada tendr los mismos valores en ID1 e ID2 que la que bloquea, y, ya que
est haciendo la peticin de bloqueo que no puede obtener, tendr REQUEST>0.
En el query anterior puedes ver que el SID 137 est bloqueando al SID 144. SID 137 corresponde a
SESION1 y SID 144 es SESION2 que est bloqueada.
Para no hacer la comparacin slo viendo los datos de ese query puedes ejecutar lo siguiente
SQL> select l1.sid || ' ESTA BLOQUEANDO ' || l2.sid
2 from v$lock l1, v$lock l2
3 where l1.block = 1
4 and l2.request > 0
5 and l1.id1 = l2.id1
6 and l1.id2 = l2.id2;
L1.SID||'ESTABLOQUEANDO'||L2.SID
----------------------------------137 ESTA BLOQUEANDO 144
mejor an, si se incluye la tabla v$session la informacin es an ms legible
SQL> select s1.username || '@' || s1.machine
2 || ' ( SID=' || s1.sid || ' ) esta bloqueando '
3 || s2.username || '@' || s2.machine || ' ( SID=' || s2.sid || ' ) ' as estado_bloqueos
4 from v$lock l1, v$session s1, v$lock l2, v$session s2
5 where s1.sid = l1.sid
6 and s2.sid = l2.sid
7 and l1.block = 1
8 and l2.request > 0
9 and l1.id1 = l2.id1
10 and l2.id2 = l2.id2;
ESTADO_BLOQUEOS
------------------------------------------------------------------------------------------SCOTT@TESTSERVER ( SID=137 ) esta bloqueando SCOTT@TESTSERVER ( SID=144 )
Hay an ms informacin en la tabla v$lock, pero para leerla, es neceario entender un poquito ms
sobre los tipos de bloqueos y los crpticas columnas ID1 e ID2
http://sartigas.blogspot.com.es/2009/07/quien-bloqueo-mi-sesion.html
26/09/2015
Pgina 3 de 5
son de sistema. Estos ltimos por lo general son muy breves y no ayuda mucho ajustar el library cache,
undo logs, etc. si te metes con v$lock.
Slo hay tres tipos de bloqueos de usuario, TX, TM y UL. UL es un bloqueo definido por el usuario
aquel definido con el paquete DBMS_LOCK. TX es un bloqueo de transaccin de registros; se
obtiene cada vez que hay una transaccin para alterar datos, sin importar la cantidad de objetos que
intervendrn en esa transaccin. Las columnas ID1 e ID2 apuntan a los segmentos de rollback y a la
tabla de entradas de transacciones de esa transaccin.
TM es un bloqueo DML. Se obtiene cada vez que un objeto es alterado. La columna ID1 identifica el
objeto en cuestin.
Modos de bloqueo
Se puede ver ms informacin observando los modos de bloqueo TM y TX. Las columnas LMODE y
REQUEST usan ambas la misma numeracin que los modos de bloqueo, en orden de exclusividad
incremental: desde 0 para sin bloqueo, hasta 6 para bloqueo exclusivo. Una sesin debe hacerse de un
bloqueo exclusivo TX para que pueda alterar los datos; LMODE ser 6. Si no puede obtener el bloqueo
exclusivo debido a que algunos de los registros que quiere alterar estn bloqueados por otra sesin,
entonces har la peticin TX en modo exclusivo; LMODE ser 0 ya que no est bloqueando, y REQUEST
ser 6. Esto se puede observar en el query ejecutado anteriormente
ADDR KADDR
SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK
-------- -------- ------- -- ------- ------- -------- -------- ------- ------2887B03C 2887B068 144 TX 196639 3891
0
6 323
0
27CF5D14 27CF5D54 137 TX 196639 3891
6
0 570
1
Observa en SESION2 que ID1 e ID2, la cual est solicitando un bloqueo TX (LMODE=0, REQUEST=6),
apunta hacia las entradas de transacciones y rollback de SESION1 que es lo que permite determinar la
sesin que bloquea a SESION2.
Es posible que te encuentres tambin con bloqueos TX en modo 4 de modo compartido(Shared). Si un
bloqueo no encuentra ninguna entrada disponible en la Lista de Transacciones Invocadas(ITL - Interest
Transaction List) y tiene registros que va a alterar, entonces la sesin obtiene un bloqueo TX en modo 4
mientras espera por la entrada(ITL). Si notas que hay contencin sobre un objeto por bloqueos TX-4, es
probable que necesites incrementar su parmetro INITRANS.
Los bloqueos TM generalmente son requeridos y adquiridos en modo 3, tambin llamado registro
compartido
exclusivo(Shared-Row
Exclusive)
y
modo
6.
Las
operaciones
DDL
[http://en.wikipedia.org/wiki/Data_Definition_Language] requieren de un bloqueo TM exclusivo. (Ntese que la
instruccin CREATE TABLE no requiere de un bloqueo TM y no lo necesita ya que el objeto en
cuestin no existe todava!) Las operaciones DML requieren de un bloqueo Shared-Row Exclusive. De
los registros seleccionados arriba sobre v$lock, puedes ver por lo niveles de bloqueo TM que son de
tipo DML
ADDR KADDR
SID TY
ID1
ID2 LMODE REQUEST CTIME BLOCK
-------- -------- ------- -- -------- -------- ------- -------- ------- ------0E3CBE90 0E3CBEC0 144 TM 69948
0
3
0 323
0
0E3CBE90 0E3CBEC0 137 TM 69948
0
3
0 570
0
http://sartigas.blogspot.com.es/2009/07/quien-bloqueo-mi-sesion.html
26/09/2015
Pgina 4 de 5
COMM
http://sartigas.blogspot.com.es/2009/07/quien-bloqueo-mi-sesion.html
DEPTNO
20
26/09/2015
Pgina 5 de 5
Con lo anterior puedes identificar una sesin que est bloqueando y cmo llegar hasta el registro que
est esperando la sesin bloqueada.
Publicado 15th July 2009 por Estergios Artigas
Etiquetas: Oracle
5
Ver comentarios
Estergios Artigas
Responder
Introduce tu comentario...
Comentar como:
Publicar
Unknown (Google)
Vista previa
http://sartigas.blogspot.com.es/2009/07/quien-bloqueo-mi-sesion.html
Salir
Avisarme
26/09/2015