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.