quarta-feira, 6 de abril de 2011

Como descobrir qual linha está gerando deadlock

Bom, esse post vou tentar ser o mais direto possível. Estou fazendo ele para ajudar um amigo que está precisando dessa solução...

Abra duas sessões no Oracle

Primeira sessão
Segunda sessão
create table t1 as select * from estoque3.cocoprnt

update t1 set descricao = 'VEJA BEM' where controle = '01';
update t1 set descricao = 'EU' where controle = '02';
update t1 set descricao = 'VEJA BEM' where controle = '02'; 
update t1 set descricao = 'EU' where controle = '01';

1 - Primeiramente copie alguma tabela. No exemplo estou copiando a tabela de COCOPRNT do usuário ESTOQUE3.
2 – Atualize o controle 01 da primeira sessão;
3 – Atualize o controle 02 da segunda sessão;
4 – Atualize o controle 02 na primeira sessão. A sessão deve ficar suspensa;
5 – Complete a instrução com deadlock atualizando o controle 01 na segunda sessão;

                Deve aparecer uma mensagem ORA-00060. Execute essa consulta:
select value from v$parameter where name like 'background_dump_dest'; 

                Abra o arquivo alert_nomeInstancia.log desse diretório.

                Na parte final do arquivo vai ter o caminho de um arquivo de rastreamento (trace file) gerado pelo Oracle no local onde indica que aconteceu um deadlock.
 
                Agora busque as seguintes informações no arquivo de rastreamento:
Legenda:
object_id = 14467;
rowid = 'AAADiDAABAAAIkCAAB' e 'AAADiDAABAAAIkCAAA'

                Execute essas consultas abaixo e obtenha qual linha da tabela que foi gerado o deadlock...
--para obter o nome do objeto que gerou o lock
select owner,object_name from dba_objects where object_id = 14467;

 --para os registros que gerarão o deadlock
select * from t1 where rowid = 'AAADiDAABAAAIkCAAB';
select * from t1 where rowid = 'AAADiDAABAAAIkCAAA';
 



E era isso...

Fonte: OCA Oracle Database 11g