DBAtlas · Atlas de operaciones de bases de datos

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.

Abrir en DBAtlas →