Vous êtes sur la page 1sur 5

Quien bloque mi sesin?

Pgina 1 de 5

Quien bloque mi sesin?

15th July 2009

Recientemente me encontr con el siguiente artculo de Natalka


Roshak [http://www.orafaq.com/node/854] publicado en orafaq.com
que espero les sea de utilidad.
Cuando un usuario o desarrollador te dice que tiene su sesin
bloqueada, entendiendo por bloqueo la ejecucin de una instruccin
DML [http://en.wikipedia.org/wiki/Data_Manipulation_Language] la cual despus de lanzarla deja de
responder sabes cuan til puede ser identificar no solo quien lo est haciendo, sino tambin cual
objeto es mejor an, puedes identificar el registro exacto que tu sesin est esperando bloquear.

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

sin dar commit abro otra sesin de SQL*Plus actualizo la variable


SQL> set sqlprompt "SESION2> "
SESION2>
y en esta actualizo slo un registro
SESION2> update emp
2 set sal=1000
3 where empno=7369;
despus de presionar ENTER no regresa de immediato al prompt, he aqu el bloqueo.

Identificando la sesin que est bloqueando


En una nueva sesin de SQL*Plus revisas el contenido de v$lock que muestra los bloqueos que
existen actualmente en la base as como la relacin entre quien bloquea a quien aunque no de manera
explcita
SQL> select * from v$lock;
ADDR KADDR
SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK
-------- -------- ------- -- ------- ------- ------- --------- ------- ------........ ........ ....... .. ....... ....... ....... ......... ....... .......
2887B03C 2887B068 144 TX 196639 3891
0
6 323
0
0E3CBE90 0E3CBEC0 144 TM 69948
0
3
0 323
0

http://sartigas.blogspot.com.es/2009/07/quien-bloqueo-mi-sesion.html

26/09/2015

Quien bloque mi sesin?

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

Tipo de bloqueo y las columnas ID1 / ID2


En este caso el tipo de bloqueo es DML exclusivo ya que fu yo quien lanz la instruccin que bloquea.
Sin embargo, su puede obtener esta informacin de v$lock sin tanto esfuerzo.
Lo primero es ver la columna TYPE. Hay decenas de tipos de bloqueos, sin embargo, la gran mayora

http://sartigas.blogspot.com.es/2009/07/quien-bloqueo-mi-sesion.html

26/09/2015

Quien bloque mi sesin?

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

Quien bloque mi sesin?

Pgina 4 de 5

Encontrando el objeto bloqueado


Ahora que sabemos que cada registro TM apunta a un objeto bloqueado, se puede usar el campo ID1
para identificarlo.
SQL> select object_name from dba_objects where object_id=69948;
OBJECT_NAME
--------------------------------------------------------------EMP
A veces es suficiente con slo saber de cul objeto se trata; sin embargo, su puede ahondar an ms,
identificando no solo el objeto, sino tambin el bloque de datos e incluso el registro exacto por el que
espera SESION2.

Encontrando el registro bloqueado


Esta informacin se obtiene de v$session mediante la entrada de la sesin bloqueada
SQL> select row_wait_obj#, row_wait_file#, row_wait_block#, row_wait_row#
2 from v$session
3 where sid=144;
ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW#
------------- -------------- --------------- ------------69948
4
147
0
esto regresa el ID del objeto, el nmero relativo de archivo, el bloque en el archivo de datos y el registro
en el bloque que est esperando la sesin. Si estos datos te suenan conocidos, es porque estos son los
cuatro componentes de un ROWID extendido. Se puede construir el ROWID extendido de dicho registro
a partir de estos componentes usando el paquete DBMS_ROWID. La funcin ROWID_CREATE toma
esos datos como argumentos para regresar el ROWID
SQL> select do.object_name, row_wait_obj#, row_wait_file#, row_wait_block#, row_wait_row#,
2 dbms_rowid.rowid_create(1, row_wait_obj#, row_wait_file#, row_wait_block#, row_wait_row#)
3 from v$session s, dba_objects do
4 where sid = 144
5 and s.row_wait_obj# = do.object_id;
OBJECT_NAM ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW# DB
MS_ROWID.ROWID_C
---------- ------------- -------------- --------------- ------------- -----------------EMP
69948
4
147
0 AAARE8AAEAAAACTAAA
con el cual podemos inspeccionar directamente el registro
SQL> select * from scott.emp where rowid='AAARE8AAEAAAACTAAA';
EMPNO ENAME
JOB
MGR HIREDATE
SAL
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369 SMITH
CLERK
7902 17-DEC-80
800

COMM

http://sartigas.blogspot.com.es/2009/07/quien-bloqueo-mi-sesion.html

DEPTNO

20

26/09/2015

Quien bloque mi sesin?

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

Sam 1 de marzo de 2010, 18:13


Responder

Estergios Artigas

2 de marzo de 2010, 1:55

Responder

Sam 2 de marzo de 2010, 20:49


Responder

Moni 11 de abril de 2010, 21:45


Responder

Anonymous 21 de agosto de 2014, 11:24


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

Vous aimerez peut-être aussi