quien-bloqueo-mi-sesion.pdf
TRANSCRIPT
-
7/26/2019 quien-bloqueo-mi-sesion.pdf
1/5
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.
Usar la tabla emp del esquema SCOTT. Abro una sesin de SQL*Plus y configuro los siguiente
parmetrosSQL> 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 commitabro otra sesin de SQL*Plus actualizo la variableSQL> 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.
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
Quien bloque mi sesin?
Creando el bloqueo
Identificando la sesin que est bloqueando
Pgina 1 de 5Quien bloque mi sesin?
26/09/2015http://sartigas.blogspot.com.es/2009/07/quien-bloqueo-mi-sesion.html
-
7/26/2019 quien-bloqueo-mi-sesion.pdf
2/5
0E3CBE90 0E3CBEC0 137 TM 69948 0 3 0 570 0
27CF5D14 27CF5D54 137 TX 196639 3891 6 0 570 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
ID1e ID2. La sesin bloqueada tendr los mismos valores en ID1e ID2que 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$sessionla 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 ID1eID2
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$locksin tanto esfuerzo.
Lo primero es ver la columna TYPE. Hay decenas de tipos de bloqueos, sin embargo, la gran mayora
Tipo de bloqueo y las columnas ID1 / ID2
Pgina 2 de 5Quien bloque mi sesin?
26/09/2015http://sartigas.blogspot.com.es/2009/07/quien-bloqueo-mi-sesion.html
-
7/26/2019 quien-bloqueo-mi-sesion.pdf
3/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 ID1e ID2apuntan a los segmentos de rollback y a latabla 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.
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 exclusividadincremental: 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; LMODEser 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; LMODEser 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 ID1e 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 00E3CBE90 0E3CBEC0 137 TM 69948 0 3 0 570 0
Modos de bloqueo
Pgina 3 de 5Quien bloque mi sesin?
26/09/2015http://sartigas.blogspot.com.es/2009/07/quien-bloqueo-mi-sesion.html
-
7/26/2019 quien-bloqueo-mi-sesion.pdf
4/5
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.
Esta informacin se obtiene de v$sessionmediante 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 COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
Encontrando el objeto bloqueado
Encontrando el registro bloqueado
Pgina 4 de 5Quien bloque mi sesin?
26/09/2015http://sartigas.blogspot.com.es/2009/07/quien-bloqueo-mi-sesion.html
-
7/26/2019 quien-bloqueo-mi-sesion.pdf
5/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 2009porEstergios Artigas
Etiquetas: Oracle
Salir
Avisarme
Introduce tu comentario...
Comentar como: Unknown (Goo
Publicar Vista previa
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:49Responder
Moni 11 de abril de 2010, 21:45
Responder
Anonymous 21 de agosto de 2014, 11:24
Responder
Pgina 5 de 5Quien bloque mi sesin?
26/09/2015h // i bl /2009/07/ i bl i i h l