Академический Документы
Профессиональный Документы
Культура Документы
Fernando Garcia
Follow Fernando Garcia / 2.21.2015 at 4:30pm
De todo los posts que he publicado en Toad World, los dos primeros en el ranking de
lecturas giran en torno a un mismo tema: la concurrencia. Y hay una diferencia en
cantidad de lecturas bastante considerable con respecto al resto de los art�culos.
En los cursos de lenguaje SQL que he dictado hace un tiempo, tambi�n not� un
inter�s creciente de los participantes cuando habl�bamos acerca de concurrencia y
lockeos.
User created.
User created.
Grant succeeded.
SQL>
Para simular los juguetes vamos a crear una tabla de JUGUETES con dos filas: una
para el arco y otra para la flecha.
Table created.
1 row created.
1 row created.
SQL> commit
2 /
Commit complete.
Grant succeeded.
Synonym created.
SQL>
sqlplus rubio/rubio
sqlplus moreno/moreno
1 row updated.
SQL>
1 row updated.
SQL>
El ni�o rubio intenta tomar la flecha. Sqlplus no retorna el prompt. El ni�o rubio
se queda esperando
El ni�o moreno intenta tomar el arco. Sqlplus no retorna el prompt. El ni�o moreno
se queda esperando
ERROR at line 2:
SQL>
Oracle detecta la situaci�n de abrazo mortal, eligi� al ni�o rubio como �v�ctima�.
JUGUETE E
---------- -
ARCO O
FLECHA L
SQL>
Adicionalmente, Oracle hizo rollback de la �ltima sentencia del ni�o rubio (la
flecha no pas� a estado �O�).
SQL> rollback
2 /
Rollback complete.
SQL>
1 row updated.
SQL>
Con este peque�o ejemplo hemos visto que Oracle detecta y resuelve autom�ticamente
las situaciones de �abrazo mortal�, elige una v�ctima y hace rollback de la �ltima
sentencia de dicha v�ctima. Cuando la v�ctima hace COMMIT o ROLLBACK de la
transacci�n, la otra sesi�n bloqueada se libera.
�Podemos hacer algo para saber si en nuestra base de datos est�n ocurriendo
�abrazos mortales�? La respuesta es afirmativa. Cada vez que Oracle detecta un
abrazo mortal genera un archivo de trace con detalles de lo ocurrido. �D�nde queda
el archivo? La ubicaci�n est� determinada por el valor del par�metro
USER_DUMP_DEST:
SQL>
[Transaction Deadlock]
Deadlock graph:
---------Blocker(s)-------- ---------
Waiter(s)---------
Resource Name process session holds waits process
session holds waits
TX-00050010-000009E4-00000000-00000000 39 38 X 36 53
X
TX-0003001C-000009E4-00000000-00000000 36 53 X 39
Esto ha sido todo por hoy. Hemos visto qu� es un abrazo mortal, lo hemos generado
de manera �artificial� y pudimos ver el comportamiento de Oracle ante un escenario
de este tipo.
Fernando.
Por lo general, el DBA es quien descubre los vestigios de un abrazo mortal ocurrido
en la base de datos. �Por qu�? En su rutina de controles y verificaciones
peri�dicas el administrador de la base de datos tropieza con la evidencia del
abrazo mortal en los archivos de trace generados en el servidor. A partir de dicho
hallazgo el DBA iniciar� un an�lisis forense de las evidencias a fin de esclarecer
lo acontecido.
Hagamos entonces un peque�o an�lisis forense del archivo de trace generado a partir
del abrazo mortal provocado artificialmente en mi art�culo anterior.
[oracle@localhost trace]$
[oracle@localhost trace]$
Sigo observando el archivo y encuentro lo que se conoce como �gr�fico del abrazo
mortal�:
Deadlock graph:
---------Blocker(s)--------
---------Waiter(s)---------
Resource Name process session holds waits process
session holds waits
TX-00050010-000009E4-00000000-00000000 39 38 X 36 53
X
TX-0003001C-000009E4-00000000-00000000 36 53 X 39 38
X
Con estas l�neas comienza a develarse parte del misterio. �Qui�nes intervinieron
en el abrazo mortal? Las sesiones 38 y 53. �Y a qui�n corresponden estas sesiones?
M�s abajo en el archivo observo:
Como este trace corresponde a la sesi�n 38, el archivo de trace rotula a la sesi�n
53 como �la otra sesi�n� (OTHER). Ahora sabemos que la �otra sesi�n� era del
usuario MORENO.
��..
Information for THIS session:
�.
�
(session) sid: 38 ser: 177 trans: 0x75576920, creator: 0x78645628
flags: (0x45) USR/- flags_idl: (0x1) BSY/-/-/-/-/-
flags2: (0x40009) -/-/INC
DID: 0001-0027-00000007, short-term DID: 0000-0000-00000000
txn branch: (nil)
con_id/con_uid/con_name: 3/3345156736/PDB1
edition#: 133 user#/name: 122/RUBIO
4) Que la v�ctima elegida por Oracle fue RUBIO y que su �ltima sentencia fue
autom�ticamente �rollbackeada�
La sesi�n 38, es decir la del usuario RUBIO estaba esperando por la fila cuyo ROWID
era el AAAXa/AANAAAACDAAB y que pertenece al objeto 95935. Veamos:
OBJECT_NAME
-----------
JUGUETES
JUGUETE E
--------- -
FLECHA O
La sesi�n 53, es decir la del usuario MORENO estaba esperando por la fila cuyo
ROWID era el AAAXa/AANAAAACDAAA y que pertenece tambi�n al mismo objeto. Analicemos
entonces solamente el ROWID:
SQL>
3) Los actores del abrazo mortal fueron el ni�o rubio y el ni�o moreno
4) En el momento del abrazo mortal el ni�o rubio quiso tomar la flecha, que
estaba en poder del ni�o moreno.
5) En el momento del abrazo mortal el ni�o moreno quiso tomar el arco, que
estaba en poder del ni�o rubio
6) La v�ctima elegida por Oracle fue el ni�o rubio y su �ltima sentencia fue
autom�ticamente �rollbackeada�
Gracias al an�lisis forense del archivo de trace, hemos reconstruido la escena del
abrazo mortal.
Nos vemos!
Fernando.