Cuando Oracle deshace una sentencia con ORA-00060, escribe en el trace de la sesión que recibió el error un bloque con quién esperaba a quién. El informe lee ese bloque y muestra el ciclo de espera, las sesiones, la fila disputada, el SQL y el diagnóstico por el tipo de lock.
Qué muestra la sección
La sección Deadlocks aparece cuando el trace tiene el bloque DEADLOCK DETECTED, en dos casos:
- el trace solo de deadlock, sin las líneas del 10046 (cómo obtener el trace del deadlock): el informe tiene solo el Resumen, el Diagnóstico y los Deadlocks, y el Resumen muestra Deadlocks (ORA-00060), Detectado el, Sesiones involucradas y Diagnóstico;
- el trace 10046 en el que hubo un deadlock en medio: la sección va después del Diagnóstico, y el resto del informe sigue normal.
El texto de arriba dice de dónde viene el dato: Del bloque DEADLOCK DETECTED que Oracle escribe en el trace de la sesión que recibió el ORA-00060: quién esperaba a quién, en qué fila y con qué sentencia.
Cada deadlock es una tarjeta Deadlock N, con la hora, la línea del trace y el tipo que Oracle escribe entre corchetes, como Transaction Deadlock. El Diagnóstico tiene un hallazgo de gravedad alta para cada uno de los primeros deadlocks del trace, con el enlace Ver deadlock.
El trace sintético del ejemplo no tiene deadlock, y el informe de ejemplo no tiene esta sección.
Cómo leerla
La tarjeta empieza por el diagnóstico, destacado, y por el ciclo de espera, a partir de la sesión que recibió el error: Sesión 12 espera a Sesión 34, que espera a la Sesión 12. Después vienen tres bloques.
| Columna | Qué indica |
|---|---|
| Recurso | El nombre del recurso disputado, como lo escribe Oracle, por ejemplo TX-00090004-00012345. |
| Tipo | El tipo de lock: TX (transacción, fila), TM (tabla), UL (lock de la aplicación) y otros. En el TM, viene junto el object_id de la tabla, con enlace a la página del objeto en la consola. |
| Sesión en espera y Modo solicitado | La sesión que pidió el lock y el modo que pidió, como X (exclusivo) o S (compartido). |
| Sesión que retiene y Modo retenido | La sesión que tenía el lock y el modo en que lo tenía. |
En Sesiones involucradas, cada sesión tiene un bloque con Usuario, PDB, Máquina, Programa, Módulo, Acción, Fila esperada y el SQL que ejecutaba. La que recibió el error lleva la marca recibió el ORA-00060. La Fila esperada trae el object_id, el archivo, el bloque y el slot de la fila disputada y, cuando el trace lo graba, el rowid.
Pila PL/SQL de la sesión que recibió el error muestra, con el sql_id de la sentencia, los objetos y las líneas del PL/SQL en ejecución, de la llamada más interna, donde estaba la sentencia, a la más externa. En la consola, cada objeto lleva a una página con el fragmento del código alrededor de la línea (página del objeto).
El diagnóstico por tipo de lock
| Cuando el grafo tiene | Título en el informe | Qué suele ser |
|---|---|---|
| Lock TM | Deadlock en bloqueo de tabla (TM) | Clave foránea sin índice: al cambiar la clave o borrar la fila de la tabla padre, Oracle bloquea la tabla hija entera. Cree un índice en las columnas de la clave foránea de la tabla hija. |
| Lock UL | Deadlock en bloqueo de usuario (UL) | Locks pedidos por la aplicación con DBMS_LOCK, en distinto orden entre las sesiones. |
| Lock TX con espera en modo S | Deadlock de transacción con espera en modo S | Dos sesiones insertando la misma clave única o primaria, falta de ITL en el bloque (INITRANS bajo) o índice bitmap bajo DML concurrente. |
| Solo locks TX en modo X | Deadlock de fila (TX en modo X) | Dos transacciones que cambian las mismas filas en órdenes distintos. La corrección está en la aplicación: cambiar las filas siempre en el mismo orden, bloquearlas antes con SELECT ... FOR UPDATE en el mismo orden o acortar la transacción. |
| Otros tipos | Deadlock entre sesiones | Locks de los tipos del grafo pedidos en distinto orden entre las sesiones. |
Las filas valen en este orden: con un lock TM en el grafo, el diagnóstico es el de tabla, aunque haya TX. Todo diagnóstico termina recordando que Oracle deshizo solo la sentencia de la sesión que recibió el ORA-00060: su transacción sigue abierta hasta el commit o el rollback.
Solo la sesión que recibió el error escribe el bloque en su trace. El trace de las otras sesiones del ciclo no tiene el deadlock; lo que se sabe de ellas está en Sesiones involucradas.
Cuándo preocupa
- Todo deadlock es un hallazgo de gravedad alta: se deshizo una sentencia, y la aplicación recibió el error.
- Deadlocks que se repiten en los mismos objetos y sentencias: el orden de acceso de la aplicación es el problema, y la corrección está en el código (deadlock).
- Deadlock en lock TM: compruebe los índices de las claves foráneas de la tabla hija en la página del objeto.
En el trace 10046, el error también aparece en Errores, en la tarjeta del ORA-00060, con el enlace Ver el deadlock.
Adónde ir después
- Deadlock, para la causa y la solución.
- Trace de deadlock, para encontrar y enviar el archivo.
- Objetos, para las consultas de la tabla y del PL/SQL en la base de datos.