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.
| Coluna | O que diz |
|---|---|
| Recurso | O nome do recurso disputado, como o Oracle grava, por exemplo TX-00090004-00012345. |
| Tipo | O 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 pedido | A sessão que pediu o lock e o modo que ela pediu, como X (exclusivo) ou S (compartilhado). |
| Sessão que segura e Modo seguro | A 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
| Quando o grafo tem | Título no relatório | O que costuma ser |
|---|---|---|
| Lock TM | Deadlock 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 UL | Deadlock 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 S | Deadlock de transação com espera em modo S | Duas 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 X | Deadlock 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 tipos | Deadlock entre sessões | Locks 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
- Deadlock, para a causa e a resolução.
- Trace de deadlock, para achar e enviar o arquivo.
- Objetos, para as consultas da tabela e do PL/SQL no banco.