Manejo de DEADLOCK

Existen muchos casos con este error, y es como que debemos siempre buscar la parte logica de decirle al cliente que la aplicacion esta hecha de la forma correcta.

Estuve investigando un poco e hice un ejemplo, espero que sea de utilidad, como entender un deadlock. Traducido significa, "abrazo mortal" es cuando 2 o más usuarios están esperando algún dato que está siendo loqueado por alguna sesión. Si ésto sucede, los usuarios involucrados en el Deadlock deben esperar y no pueden continuar con el procesamiento. Cuando Oracle detecta que se produjo un Deadlock, lo que hace es cortar la ejecución del procedimiento y mostrar el siguiente mensaje de error: ORA-00060: deadlock detected while waiting for resource. Tengamos en cuenta que cuando se produce éste error, Oracle genera un archivo de trace en el directorio UDUMP con información acerca del error, a titulo informativo, por lo general este trace nos dice que query produjo el error y quien loqueo a quien... es aca donde le podemos decir al cliente que la arregle y vea donde esta el problema en la aplicacion, claro que esto despues de varios deadlock en la misma consulta... generalmente éste problema se produce por un mal diseño de la aplicación.

Arme un ejemplo facil y dio resultado..

SQL_9iR2> CREATE TABLE sesion_1 AS
2 SELECT level id, 'nom_'||level nombre
3 FROM dual
4 CONNECT BY level <= 10 ;

Table created.

SQL_9iR2> CREATE TABLE sesion_2 AS
2 SELECT level id, 'nom_'||level nombre
3 FROM dual
4 CONNECT BY level <= 10 ;

Table created.

En la SESION 1 loqueo un registro de la tabla SESION_1 correspondiente al ID 1.

SQL_9iR2> UPDATE sesion_1
2 SET nombre = 'nom_'||id*2
3 WHERE id = 1 ;

1 row updated.

En la SESION 2 loqueo un registro de la tabla SESION_2 correspondiente al ID 1.

SQL_9iR2> UPDATE sesion_2
2 SET id = id+10
3 WHERE id = 1 ;

1 row updated.

En la SESION 1 modifico un registro de la tabla SESION_2 correspondiente al ID 1. Vemos que esta sesión se 'colgó' debido al loqueo y no nos devuelve el control. Todavía no se produjo el Deadlock... sólo se produjo un loqueo.

SQL_9iR2> UPDATE sesion_2
2 SET id = id+10
3 WHERE id = 1 ;

En la SESION 2 modifico un registro de la tabla SESION_1 correspondiente al ID 1.
Vemos que esta sesión se 'colgó' debido al loqueo y no nos devuelve el control.

SQL_9iR2> UPDATE sesion_1
2 SET nombre = 'nom_'||id*2
3 WHERE id = 1 ;

Esto va a producir un Deadlock y luego de unos segundos aparece un mensaje de error en la SESION 1:

SQL_9iR2> UPDATE sesion_2
2 SET id = id+10
3 WHERE id = 1 ;
UPDATE sesion_2
*
ERROR at line 1:
ORA-00060: deadlock detected while waiting for resource

La SESION 2 sigue colgada esperando que la SESION 1 termine la transacción que comenzó. Entonces en la SESION 1 ejecutamos...

SQL_9iR2> rollback ;

Rollback complete.

En la SESION 2 se libera automáticamente el loqueo...

SQL_9iR2> UPDATE sesion_1
2 SET nombre = 'nom_'||id*2
3 WHERE id = 1 ;

1 row updated.

Comentarios

Entradas populares de este blog

Instalar la utilidad STATSPACK. Crear snapshots y generar informe.

Fragmentacion de Tablespaces.

Top 10 de los queries que estan en memoria.