Sim, ORA-0060 é um DEADLOCK, eu já vi n+1! vezes esse resultado, é algo comum, 
via de regra resultante de erro OU do programador (que 'esqueceu' que está num 
ambiente multi-usuário)  OU do analista/da que não indexou FKs, essas são as 
duas origens mais comuns - há alguns mais, 
http://oracle-error.blogspot.com/2008/10/ora-00060-deadlock-detected-while_20.html
 lista-os, mas DE LONGE, DE LONGE MESMO, locks e FKs são os mais comuns, vou 
discutir em delathes eles por causa disso.... Pra vc poder 'resolver' , 
primeiro vc tem que ENTENDER o que é esse DEADLOCK, pra depois ver QUAL 
programa e/ou qual implementação física de constraint ou o que foi que está 
causando, aí sim altere.... O que tem que ficar claro é que *** NÂO *** é um 
'parâmetro' de banco, não é nada GERAL e GENÈRICO que 'resolve' esse cara....

 Muito bem, os conceitos principais  aqui q devem ser lembrados são :
 
 a) no bd Oracle quando acontece um DML ou um DDL o lock é automático e 
inescapável
 
 b) por default quando vc lê um dado NÂO ocorre lock de nenhum tipo (nem no 
registro, nem na tabela), é completamente diferente de outros databases aonde 
se vc quer leitura consistente vc TEM que lockar antes de ler
 
 c) quando o lock é à nível de tabela e a alteração é um DDL, o comportamento 
default do bd Oracle pra uma outra sessão é após um intervalo (alterável nos 
últimos releases) se não desocupou a tabela a segunda sessão recebe um 
ORA-00054: resource busy and acquire with NOWAIT specified : já para uma sessão 
que está esperando desocupar um lock de registros (causado por DML), ou um lock 
explícito (não resultado de DDL), o comportamento default é a segunda sessão 
ficar ESPERANDO e ESPERANDO, até o lock ser liberado
 
OK, com esses conceitos na cuca, o DEADLOCK pode ser explicado assim : imagine 
que uma sessão A vai usar um recurso compartilhado (um dado registro X duma 
tabela, digamos),  e portanto o bloqueia (talvez até um bloqueio automático 
decorrente de DML, como eu disse acima), e após isso uma sessão B, numa outra 
transação, usa e bloqueia um outro recurso (um registro Y, digamos). Muito bem, 
com essa situação ativa digamos que a sessão A tente fazer um lock (via DML, 
digamos) no registro Y que B está usando, como isso está em uso a sessão A 
passa a ficar em WAIT, e enquanto A está em wait nessa hora B tenta usar o 
registro X, que está lockado por A, e fica esperando A liberar, taí o enguiço : 
A está esperando B liberar o registro Y, B está esperando A liberar o registro 
X, nunca isso vai acontecer, uma está esperando pela outra, é um 'loop eterno', 
o banco reconhece isso e desfaz a última operação de uma das operações, 
mandando pra ela um ORA-0060, é isso....  Confere ??? Uma situação similar, não 
exatamente a mesma mas com a mesma lógica e mesmo erro, pode acontecer se há 
uma constraint FK, numa tabela grande e intensamente usada, não há índice nessa 
FK e uma operação que exige checagem completa de todos os registros ocorre - 
por exemplo, se faz um DELETE na PK cascade da tabela-pai, num caso desses 
evidentemente TODA a tabela-filho TEM que ser varrida pra que    os filhos do 
pai em deleção sejam removidos também, se não houver índice a única maneira 
segura é lockar a tabela-filha inteira, o que pode dar DEADLOCK também se há 
outras sessões usando/querendo usar... 
  É isso, o DEADLOCK é um erro de 'lógica', não adinata vc colocar 'o gatilho 
para executar depois do insert ocorre o erro' , pode ser antes, depois, não 
importa.... No caso também EM ABSOLUTO importa se a alteração é feita via 
trigger ou via outros caminhos, QUALQUER alteração aonde não se cheque o uso 
antes de lockar ** PODE ** casuar DEADLOCKs... A correção é vc ** CONSULTAR ** 
se o recurso está disponível antes de lockar (no caso de locks de usuário), 
e/ou vc INDEXAR as FKs, se for aplicável...
  
Pra vc saber se é causado por DMLs/locks ou por constraints, e ter uma noção de 
qual SQL está causando a questão :
  
   a) cheque direitinho as tabelas envolvidas levantando os índices/constraints 
TODOS
   
   b) SEMPRE que há um DEADLOCK o banco Oracle gera no servidor um arquivo 
trace, um TEXTo com diversas informações úteis, 
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1528515465282
 e 
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:6369740147072#18101788127506
 falam um pouquinho
   
   c) nos releases mais recentes no alert.log do banco (outro arquivo gerado no 
servidor Oracle) após um DEADLOCK mais infos são geradas lá também
   
   d) opcionalmente vc pode escrever uma trigger de erros para capturar mais 
informação do banco quando der um erro qquer (não só o ORA-0060)
   
[]s

 Chiappa
 

--- Em oracle_br@yahoogrupos.com.br, Leonardo Santos da Mata 
<leonardodam...@...> escreveu
>
> ORA-00060 conflito detectado ao aguardar recurso no oracle 10 G
> 
> pessoal alguém já passou por esse aqui?
> a situação é a seguinte:
> 
>  Tenho uma tabela A e B.
> tenho um gatilho na tabela A que precisará inserir na tabela B.
>  Mesmo colocando o gatilho para  executar depois do insert ocorre o erro.
>  Alguém sabe como eu resolvo isso.
> 
> Obrigado
> 
> 
> --
> 
> 
> [As partes desta mensagem que não continham texto foram removidas]
>


Responder a