DBAtlas · Atlas de operações de banco de dados

Deadlock / conflito de lock (ORA-00060, 1213, 40P01)

Você encontrou um deadlock (Oracle ORA-00060, MySQL 1213, PG 40P01, MSSQL 1205). Capture o grafo, descubra o padrão, evite a recorrência. Deadlocks se resolvem pelo design — o objetivo é reduzir sua frequência.

Primeiro capture o deadlock graph

Quais duas (ou mais) sessões, quais recursos, quais modos de lock colidiram? Não aplique correções às cegas sem ver isso.

-- 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;
  • Tenho o grafo — duas transações bloqueiam recursos em ordem inversa
  • Muitas transações se acumulam em uma única linha/tabela (hotspot)
  • Há locks de intervalo amplos (muitas linhas ficam bloqueadas)

A consulta que bloqueia usa um índice?

Sem índice, um UPDATE/DELETE bloqueia muitas linhas (até a tabela inteira) para satisfazer a cláusula WHERE → uma fonte de deadlocks. Verifique o plano.

EXPLAIN <the UPDATE/DELETE involved in the deadlock>;  -- type=ALL means a full scan, no index
  • Sem índice / faz full scan
  • Há um índice, mas ainda há conflito

Causa raiz: ordem de lock inversa

A causa mais comum de deadlock: duas transações acessam recursos em ordens diferentes. Quando A→B e B→A acontecem ao mesmo tempo, ocorre o deadlock.

Causa raiz: índice faltante → locks amplos

Um UPDATE/DELETE sem índice bloqueia mais linhas que o necessário e torna os deadlocks muito mais prováveis.

Causa raiz: hotspot

Muitas transações se acumulam ao mesmo tempo em um único recurso, como uma linha/chave de contador.

Abrir no DBAtlas →