Pular para o conteúdo
WaitScope Entrar Solicitar acesso (por e-mail) Menu

Deadlocks: grafo, sessões e diagnóstico

Como ler o deadlock gravado no trace: quem esperava por quem, as sessões, a linha disputada, o SQL, a pilha PL/SQL e o diagnóstico pelo lock.

Vale para: Traces de deadlock e traces 10046 com ORA-00060

Quando o Oracle desfaz um comando com ORA-00060, ele grava no trace da sessão que recebeu o erro um bloco com quem esperava por quem. O relatório lê esse bloco e mostra o ciclo de espera, as sessões, a linha disputada, o SQL e o diagnóstico pelo tipo de lock.

O que a seção mostra

A seção Deadlocks aparece quando o trace tem o bloco DEADLOCK DETECTED, em dois casos:

  • o trace só de deadlock, sem as linhas do 10046 (como obter o trace do deadlock): o relatório tem só o Resumo, o Diagnóstico e os Deadlocks, e o Resumo mostra Deadlocks (ORA-00060), Detectado em, Sessões envolvidas e Diagnóstico;
  • o trace 10046 em que houve um deadlock no meio: a seção vem depois do Diagnóstico, e o resto do relatório segue normal.

O texto do alto diz de onde vem o dado: Do bloco DEADLOCK DETECTED que o Oracle grava no trace da sessão que recebeu o ORA-00060: quem esperava por quem, em que linha e com qual comando.

Cada deadlock é um cartão Deadlock N, com o horário, a linha do trace e o tipo que o Oracle grava entre colchetes, como Transaction Deadlock. O Diagnóstico tem um achado de severidade alta para cada um dos primeiros deadlocks do trace, com o link Ver deadlock.

O trace sintético do exemplo não tem deadlock, e o relatório de exemplo não tem esta seção.

Como ler

O cartão começa pelo diagnóstico, em destaque, e pelo ciclo de espera, a partir da sessão que recebeu o erro: Sessão 12 espera Sessão 34, que espera a Sessão 12. Depois vêm três blocos.

Colunas do Grafo de espera
ColunaO que diz
RecursoO nome do recurso disputado, como o Oracle grava, por exemplo TX-00090004-00012345.
TipoO tipo de lock: TX (transação, linha), TM (tabela), UL (lock da aplicação) e outros. No TM, vem junto o object_id da tabela, com link para a página do objeto na console.
Sessão que espera e Modo pedidoA sessão que pediu o lock e o modo que ela pediu, como X (exclusivo) ou S (compartilhado).
Sessão que segura e Modo seguroA sessão que tinha o lock e o modo em que o tinha.

Em Sessões envolvidas, cada sessão tem um bloco com Usuário, PDB, Máquina, Programa, Módulo, Ação, Linha esperada e o SQL que ela rodava. A que recebeu o erro tem a marca recebeu o ORA-00060. A Linha esperada traz o object_id, o arquivo, o bloco e o slot da linha disputada e, quando o trace grava, o rowid.

Pilha PL/SQL da sessão que recebeu o erro mostra, com o sql_id do comando, os objetos e as linhas do PL/SQL em execução, da chamada mais interna, onde estava o comando, para a mais externa. Na console, cada objeto leva a uma página com o trecho do código em volta da linha (página do objeto).

O diagnóstico por tipo de lock

Diagnóstico do deadlock pelo tipo de lock
Quando o grafo temTítulo no relatórioO que costuma ser
Lock TMDeadlock em lock de tabela (TM)Chave estrangeira sem índice: ao alterar a chave ou apagar a linha da tabela pai, o Oracle trava a tabela filha inteira. Crie índice nas colunas da chave estrangeira da tabela filha.
Lock ULDeadlock em lock de usuário (UL)Locks pedidos pela aplicação com DBMS_LOCK, em ordem diferente entre as sessões.
Lock TX com espera em modo SDeadlock de transação com espera em modo SDuas sessões inserindo a mesma chave única ou primária, falta de ITL no bloco (INITRANS baixo) ou índice bitmap sob DML concorrente.
Só locks TX em modo XDeadlock de linha (TX em modo X)Duas transações alterando as mesmas linhas em ordens diferentes. A correção está na aplicação: alterar as linhas sempre na mesma ordem, travá-las antes com SELECT ... FOR UPDATE na mesma ordem ou encurtar a transação.
Outros tiposDeadlock entre sessõesLocks dos tipos do grafo pedidos em ordem diferente entre as sessões.

As linhas valem nessa ordem: com um lock TM no grafo, o diagnóstico é o de tabela, mesmo que haja TX. Todo diagnóstico termina lembrando que o Oracle desfez só o comando da sessão que recebeu o ORA-00060: a transação dela continua aberta até o commit ou o rollback.

Só a sessão que recebeu o erro grava o bloco no trace dela. O trace das outras sessões do ciclo não tem o deadlock; o que se sabe delas está em Sessões envolvidas.

Quando preocupa

  • Todo deadlock é achado de severidade alta: um comando foi desfeito, e a aplicação recebeu o erro.
  • Deadlocks que se repetem nos mesmos objetos e comandos: a ordem de acesso da aplicação é o problema, e a correção é no código (deadlock).
  • Deadlock em lock TM: confira os índices das chaves estrangeiras da tabela filha na página do objeto.

No trace 10046, o erro também aparece em Erros, no cartão do ORA-00060, com o link Ver o deadlock.

Para onde ir depois

Atualizado em 29/10/2026. Relatar erro nesta página