Deadlock / conflicto de bloqueos (ORA-00060, 1213, 40P01)
Ha sufrido un deadlock (Oracle ORA-00060, MySQL 1213, PG 40P01, MSSQL 1205). Capture el grafo, identifique el patrón y evite que se repita. Los deadlocks se resuelven con el diseño — el objetivo es reducir su frecuencia.
Primero capture el deadlock graph
¿Qué dos (o más) sesiones, qué recursos y qué modos de bloqueo chocaron? No aplique soluciones a ciegas sin ver esto.
-- Check the trace file referenced in the alert log (deadlock graph). For history:
SELECT * FROM dba_hist_active_sess_history WHERE event LIKE 'enq: TX%' ORDER BY sample_time DESC FETCH FIRST 20 ROWS ONLY;- Tengo el grafo — dos transacciones bloquean recursos en orden inverso
- Muchas transacciones se acumulan sobre una sola fila/tabla (hotspot)
- Hay bloqueos de rango amplios (se bloquean muchas filas)
¿Usa un índice la consulta que bloquea?
Sin índice, un UPDATE/DELETE bloquea muchas filas (incluso la tabla entera) para satisfacer la cláusula WHERE → una fuente de deadlocks. Revise su plan.
EXPLAIN <the UPDATE/DELETE involved in the deadlock>; -- type=ALL means a full scan, no index- Sin índice / hace un full scan
- Hay índice, pero sigue habiendo conflictos
Causa raíz: orden de bloqueo inverso
La causa más común de deadlock: dos transacciones acceden a los recursos en órdenes distintos. Cuando A→B y B→A ocurren a la vez, se interbloquean.
Causa raíz: índice faltante → bloqueos amplios
Un UPDATE/DELETE sin índice bloquea más filas de las necesarias y hace mucho más probables los deadlocks.
Causa raíz: hotspot
Muchas transacciones se acumulan a la vez sobre un único recurso, como una fila/clave contador.