É isso mesmo : vou aproveitar a thread e tentar dar uma esclarecida no que foi falado . PRIMEIRO DE TUDO, um deadlock absolutamente *** NÃO É *** causado por ausência/presença de parâmetro NENHUM, e não há parâmetro NENHUM que intensifique/diminua/previna deadlocks. Um deadlock é ** SEMPRE **, absolutamente ** SEMPRE **, resultado de DUAS (ou mais, porém ao menos duas) transações querendo fazer DMLs nos mesmo registros e numa determinada sequência, que mostrarei abaixo, E/OU existem DMLs internos fazendo lock, tipicamente por causa de FKs sem índices - assim, Juliano, se num banco A vc tem um deadlock e num banco B vc não tem significa ** SIMPLESMENTE ** que OU a sequência dos DMLs não foi a mesma nos dois bancos E/OU vc tem FKs indexadas em um e não no outro. Sobre a questão das FKs, inclusive, temos que pensar no TAMANHO e na PERFORMANCE dos bancos envolvidos : o que ocorre é que se não houver índices enquanto as FKs estão sendo checadas após um DML a tabela toda é lockada, se no banco B a tabela tem muitíssimo menos registros, ou o banco B é menor/mais rápido do que A, tranquilamente PODE SER que o lock de tabela que vai acontecer em ambos houverem FKs sem índice não ocasione deadlock em B, pois a checagem termina rápido e não conflita com outras transações, ENQUANTO o mesmo comando talvez cause deadlock em A pois em A a checagem é mais demorada, a tabela é maior....
Muito bem, afora o caso das FKs, o mecanismo de um deadlock é algo mais ou menos do tipo : a transação 1 faz um DML num registro X da tabela, lockando-o e não ficando bloqueada (supondo que nesse instante ainda não haviam outras transações querendo usar o mesmo registro X), e com essa transação AINDA NÃO COMITADA (e portanto o lock presente) , uma transação 2 começa e locka um registro Y com sucesso - com este cenário , a transação 1 tenta fazer um lock (via DML ou não, não importa) no registro Y, que está em uso , e sem especificar wait time máximo, já que Y está em uso pela T2 a transação T1 esperando o registro ser liberado com COMMIT ou ROLLBACK da T2. Imediatamente enquanto isso, a T2 tenta lockar o registro X, que está em uso pela T1, T2 passa a esperar, e assim caímos numa situação de círculo : T1 está esperando pela T2 e T2 está esperando pela T1, é o DEADLOCK, o banco Oracle reconhece a situação e faz ROLLBACK numa das transações, liberando assim a outra. OK ? Até aqui estamos bem ?? Então agora ficou fácil, o que fazer para não ter DEADLOCKS ? Vc pode : a) as duas transações T1 e T2 para intervalos de tempo/janelas DIFERENTES, aonde não conflitem, se possível OU b) se há grandes chances de conflitos do tipo ocorrerem, alterar os programas para que ** ANTES ** de tentarem o lock via DML, ** CHEQUEM ** se o registro está disponível (lock pessimista), isso pode ser feito (por exemplo) com a cláusula de WAIT , http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:5771117722373#28949166930931 tem um exemplinho. Assim, se o seu programa que faz UPDATE necessariamente TEM QUE rodar na mesma janela que o outro tal programa que faz SELECT... FOR UPDATE, vc altere o seu programa para ** CHECAR ** se está disponível antes de sair UPDATEando o registro, yes ? []s Chiappa --- Em oracle_br@yahoogrupos.com.br, Thiago Azevedo <thiago.a.azev...@...> escreveu > > Juliano, > > Os motivos para o dead lock ocorrerem em um ambiente e em outro com a mesma > configuração não podem ser diversos, mas entre eles o mais provável é a > concorrência de processos. > > Verifique no alert.log a mensagem de dead lock e os arquivos de trace > referenciados, pois neles você encontrará os comandos que estão causando > esse problema. Já que você não pode alterar o SELECT ... FOR UPDATE, talvez > você possa alterar o comado que junto com esse gera o dead lock. > > []s! > > Thiago > > 2009/4/2 Caio Spadafora <caiospadaf...@...> > > > É possivel que seja a parametrização do banco, mas enquanto você não > > fizer o teste que eu te recomendei fica dificil diagnosticar... > > > > Refaça passo a passo o que você faz para simular essa situação acompanhando > > o comportamento de cada sessão dentro da v$lock... > > > > Verifique a existência de tabelas filhos e constraints de relacionamento > > (foreign key) nos dois bancos para os objetos envolvidos nesses comandos... > > Caso exista sugiro a criação de um índice na tabela filho na coluna que se > > referencia com a tabela pai. > > > > Mas, por favor, faça o acompanhamento de locks e enqueues se não fica > > complicado arriscar um diagnóstico. > > > > > > Atenciosamente, > > Caio Spadafora. > > http://0011brothers.blogspot.com/ > > > > --- Em qui, 2/4/09, Juliano <juli...@... <juliano%40marca.com.br>> > > escreveu: > > > > De: Juliano <juli...@... <juliano%40marca.com.br>> > > Assunto: [oracle_br] Re: ORA-00060 - Deadlock detected while waiting for > > resource > > Para: oracle_br@yahoogrupos.com.br <oracle_br%40yahoogrupos.com.br> > > Data: Quinta-feira, 2 de Abril de 2009, 9:20 > > > > Meu maior problema é que não poderei mudar a regra do negócio, pois esse > > comando está em uma aplicação que não tenho o código-fonte. > > > > Sei que é um mecanismo de LOCK do Banco, mas minha maior dúvida, é porque o > > problema ocorre em uma determinada Base de Dados e não ocorre em outra?? As > > duas são Oracle 9.2.0.4, com o mesmo tipo de instalação. > > > > Poderia ser algum parâmetro de configuração do Banco?? > > > > Atenciosamente, > > > > Juliano > > > > --- Em oracle...@yahoogrup os.com.br, Caio Spadafora <caiospadafora@ ...> > > escreveu > > > > > > > > > > Caros, > > > > > > > > > > Trata-se do mecanismo de lock do banco de dados. Sugiro você (caso sua > > regra de negócio permita) não utilize a cláusula "for update" no seu select, > > provavelmente esse sincronismo entre aplicativos não está legal e por conta > > disso esta ocorrendo alguma referência ciclica. > > > > > > > > > > Minha sugestão é você analisar se após esse comit o lock na tabela some, > > e se ao iniciar a segunda aplicação em algum momento surge algum enqueue. > > > > > > > > > > Se você entrar no meu blog: 0011brothers. blogspot. com, existe uma > > matéria a respeito de como identificar isso e contornar o problema de > > maneira contingêncial. > > > > > > > > > > O deadlock pode ser causado por alguns fatores e vai depender do seu > > modelo de dados, se você tem tabelas filhos envolvidas e algum outro tipo de > > dependencia, sugiro que você monitore a v$lock em diferentes momentos dessa > > sua execução provavelmente você vai conseguir diagnosticar melhor. > > > > > > > > > > Atenciosamente, > > > > > Caio Spadafora. > > > > > http://0011brothers .blogspot. com/ > > > > > > > > > > --- Em qua, 1/4/09, Júlio César Corrêa <juliotubista@ ...> escreveu: > > > > > > > > > > De: Júlio César Corrêa <juliotubista@ ...> > > > > > Assunto: Re: [oracle_br] ORA-00060 - Deadlock detected while waiting for > > resource > > > > > Para: oracle...@yahoogrup os.com.br > > > > > > > Data: Quarta-feira, 1 de Abril de 2009, 18:07 > > > > > > > > > > Falei besteira,sim não talvez? > > > > > > > > > > 2009/4/1 Júlio César Corrêa <juliotubista@ ...> > > > > > > > > > > > Humm. > > > > > > > > > > > > Assim. > > > > > > > > > > > > A partir do momento que a a primeira query executa,nenhum, update ou > > insert > > > > > > pode ser executado nestas linhas da tabela TABELA o qual se enquadram > > na > > > > > > clausula where (where nr_pk = 12). > > > > > > Enquanto você não executar commit ou rollback você vai ter erro. > > > > > > > > > > > > No seu caso alguns segundos podem ser responsável por essa diferença. > > > > > > > > > > > > 2009/4/1 Juliano <juliano@ > > > > > > > > > > > > > Olá lista, > > > > > >> Estou tendo o seguinte problema e gostaria de algum auxílio. > > > > > >> > > > > > >> Tenho um determinado programa que está rodando a seguinte instrução: > > > > > >> > > > > > >> Select * from TABELA where nr_pk = 12 for update; > > > > > >> update TABELA set campo1=valor1, campo2=valor2 where nr_pk = 12; > > > > > >> commit; > > > > > >> > > > > > >> Após essa instrução, é executado através de OUTRO programa, a seguinte > > > > > >> instrução: > > > > > >> > > > > > >> update TABELA set campo1=valor9 where nr_pk = 12; > > > > > >> commit; > > > > > >> > > > > > >> O problema.... > > > > > >> Quando executo esses dois programas em um determinado BD (Oracle > > 9.2.0.4), > > > > > >> tenho a mensagem de erro mostrada no título: Deadlock detected while > > waiting > > > > > >> for resource. > > > > > >> > > > > > >> Porém, ao executar os mesmos dois programas em outro BD, também > > (Oracle > > > > > >> 9.2.0.4) não é apresentado nenhum erro e as instruções são realizadas > > > > > >> corretamente. > > > > > >> > > > > > >> Penso ser algum parâmetro de configuração na base de dados. Alguém já > > > > > >> passou por um problema parecido??? Agradeço qualquer ajuda. > > > > > >> > > > > > >> OBS: Não tenho como modificar o FOR UPDATE do primeiro programa, pois > > é um > > > > > >> software de outra empresa que está funcionando de forma integrado ao > > meu. > > > > > >> > > > > > >> Abraços, > > > > > >> Juliano > > > > > >> > > > > > >> > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > > -- > > > > > > Júlio César Corrêa > > > > > > IS Technologist - Oracle DBA > > > > > > http://jccorrea. blogspot. com > > > > > > > > > > > > "To stay competitive in the tech industry, never stop > > > > > > learning. Always be on the lookout for better ways of > > > > > > doing things and new technologies. Our industry does > > > > > > not reward people who let themselves stagnate" > > > > > > -John Hall, Senior Vice President, Oracle University > > > > > > > > > > > > > > > > > > > > > > > > > > > -- > > > > > Júlio César Corrêa > > > > > IS Technologist - Oracle DBA > > > > > http://jccorrea. blogspot. com > > > > > > > > > > "To stay competitive in the tech industry, never stop > > > > > learning. Always be on the lookout for better ways of > > > > > doing things and new technologies. Our industry does > > > > > not reward people who let themselves stagnate" > > > > > -John Hall, Senior Vice President, Oracle University > > > > > > > > > > > > > > > [As partes desta mensagem que não continham texto foram removidas] > > > > > > > > > > > > > > > > > > > > ------------ --------- --------- ------ > > > > > > > > > > ------------ --------- --------- --------- --------- --------- - > > > > > >Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de > > inteira responsabilidade de seus remetentes. > > > > > Acesse: http://www.mail- archive.com/ oracle_br@ yahoogrupos. com.br/ > > > > > ------------ --------- --------- --------- --------- --------- - > > > > > >Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » > > Procedure » Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! > > VISITE: http://www.oraclebr .com.br/ > > > > > ------------ --------- --------- --------- --------- --------- - Links do > > Yahoo! Grupos > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Veja quais são os assuntos do momento no Yahoo! +Buscados > > > > > http://br.maisbusca dos.yahoo. com > > > > > > > > > > [As partes desta mensagem que não continham texto foram removidas] > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Veja quais são os assuntos do momento no Yahoo! +Buscados > > http://br.maisbuscados.yahoo.com > > > > [As partes desta mensagem que não continham texto foram removidas] > > > > > > > > > [As partes desta mensagem que não continham texto foram removidas] >