Análise de deadlock
Sintoma
'deadlock detected', 'ORA-00060', 'chosen as deadlock victim' — transações bloqueiam umas às outras e uma é abortada.
1. Deadlocks são normais, mas não devem ser frequentes
O banco detecta o deadlock e o resolve escolhendo uma vítima — isso é intencional. O objetivo é reduzir a frequência. A aplicação deve repetir a transação vítima. Primeiro capture o deadlock graph.
2. Obtenha o deadlock graph/detalhes
Quais duas (ou mais) sessões, quais recursos e quais modos de lock entraram em conflito?
Oracle
-- Check the trace file referenced in the alert log (deadlock graph). Also:
SELECT * FROM dba_hist_active_sess_history WHERE event LIKE 'enq: TX%' ORDER BY sample_time DESC;PostgreSQL
-- log_lock_waits=on; deadlock details are in postgresql.log. Check the deadlock_timeout setting.MySQL
SHOW ENGINE INNODB STATUS\G -- LATEST DETECTED DEADLOCK sectionSQL Server
-- Deadlock XML in the system_health Extended Events session (ring_buffer, recent events):
SELECT x.ev.value('@timestamp','datetime2') AS event_time, x.ev.query('.') AS deadlock_xml
FROM (SELECT CAST(t.target_data AS XML) td FROM sys.dm_xe_session_targets t
JOIN sys.dm_xe_sessions s ON s.address = t.event_session_address
WHERE s.name = N'system_health' AND t.target_name = N'ring_buffer') r
CROSS APPLY r.td.nodes('//RingBufferTarget/event[@name="xml_deadlock_report"]') AS x(ev);
-- For longer history, the event_file target:
-- SELECT CAST(event_data AS XML) FROM sys.fn_xe_file_target_read_file(N'system_health*.xel', NULL, NULL, NULL) WHERE object_name = N'xml_deadlock_report';3. Resolva o padrão de conflito
A causa mais comum: duas transações acessando recursos em ordem OPOSTA. Acesse os recursos na MESMA ordem em todos os caminhos de código. A segunda causa mais comum: locks de intervalo amplos por falta de índice — crie o índice necessário.
4. Reduza a duração e o escopo dos locks
Mantenha as transações curtas (não inclua interação com o usuário dentro de uma transação). Escolha um nível de isolamento adequado. Quando necessário, obtenha os locks de linha cedo (SELECT ... FOR UPDATE com ordenação determinística).
5. Retry na aplicação é obrigatório
Deadlocks não podem ser eliminados por completo; implemente retry automático (exponential backoff) para a transação vítima. Isso evita que o usuário veja um erro.