Nope, veja as minhas outras msgs com demonstrações (que provavelmente não te chegaram antes de vc escrever esta), que : - é CLARO que as sessões estão SIM esperando por algo, sessão que não espera por nadaé IMPOSSÍVEL - é Claro que (ao menos desde a introdução do 10g) o banco Registra sim na V$SESSION o SQL_ID sendo executado, a Espera, o objeto causando a espera, a CLASSE da espera, então tanto DÁ SIM para vc identificar sessões acessando sempre e sempre o mesmo objeto QUANTO dá para vc identificar que o SQL é com NOWAIT, o que fecha o cenário que vc descreve - INCLUSIVE, ao menos por mim essa foi uma das mais festejadas alterações no 10g, junto com a AUTOMAÇÂO das estatísticas de execução de um SQL longo na V$SQL... Só quem teve o desprazer de trabalhar com versões anteriores pode avaliar o quão útil isso é
- é VERDADE que não há como vc identificar o REGISTRO já lockado e sendo acessado constantemente via for update nowait em um loop, Mas como eu mostrei vc consegue Sim identificar as sessões constantemente acessando o mesmo OBJETO e aí pelo SQL dessas sessões vc Comprova ou não que é esse caso do NOWAIT ==> e só para deixar Escrupulosamente Claro : quem TEM que fazer COMMIT ou ROLLBACK é a sessão A, que obteve o lock e o está mantendo, SIM ??? A falha da Aplicação é que ela NEM limita o tempo que A fica com a transação aberta e mantendo o LOCK, e NEM (mesmo ela, Aplicação) sabendo que PODEM haver transações erradamente abertas por muito muito tempo, nem mesmo assim ela aplica algum LIMITE na qtdade de vezes e/ou no tempo que fica esperando A liberar o lock com o encerramento da Transação.... []s Chiappa --- Em oracle_br@yahoogrupos.com.br, JLSilva <jljlsilva@...> escreveu > > Chiappa, > Agradeço o tempo que você despendeu para analisar o caso, mas devo discordar > totalmente de você, amigo. > 1. Veja, não há nenhuma sessão esperando nada.. o select for update está > usando NOWAIT, que é justamente para não esperar.. Ocorre o ORA-00054, e a > aplicação tenta bloquear o registro novamente, e ocorre novamente o > ORA-00054, e tenta novamente.. nesse processo, ela nunca faz commit/rollback, > entende..? A sessão nunca fica numa longa espera por lock... > 2. Não é possível identificar exatamente quem está bloqueando quem, já que > não tenho como saber qual registro uma sessão está bloqueando sem ter > antecipadamente ativado um trace. O máximo que consigo é verificar todas as > sessões que têm uma transação aberta em uma tabela.. mas não em qual > registro, correto? > 3. Absolutamente verdadeiro quando digo que nunca vai terminar esse loop: > veja que é como um deadlock, mas sem o mecanismo de deadlock do Oracle, uma > vez que a aplicação é que fica num loop eterno tentando bloquear um registro > que está blqueado por outra sessão, sendo que essa outra sessão nunca vai > fazer commit/rollback já que ela também está tentando bloquear registros que > estão bloqueados pela outra sessão. > > On Mar 18, 2013, at 7:39 PM, "J. Laurindo Chiappa" <jlchiappa@...> wrote: > > > Hmmm, peraí : "nunca vai sair" é absolutamente Falso : o lock que A está > > mantendo (e que impede B de lockar o mesmo recurso) *** NÃO *** é Eterno, > > ele VAI SIM ser liberado assim que A encerrar a transação, seja com COMMIT > > seja com ROLLBACK, yes ??? Da mesma maneira, dizer que é "impossível > > identificar quem está lockando registros de quem" sorry, mas afaik é > > Inverdade também : via script é Plenamente Possível vc consultar quem está > > esperando pelo que, aí não é impossível não vc localizar quem está com o > > lock para si, os outros TODOS estão em espera por essa sessão, dado o > > cenário que vc descreve... > > > > O que é Questionável, podendo mesmo ser considerado uma FALHA no > > aplicativo é esse comportamento de : > > > > 1. deixar a transação que obteve o lock ficar ILIMITADAMENTE aberta, sem > > nenhum tipo de timeout, nem de aviso ao Operador se a transação for > > controlada pelo Usuário da aplicação e não for encerrada o mais logo > > possível > > > > e > > > > 2. dado o fato 1. acima (de poder existir Transação sem controle > > estrito de tempo), após a Aplicação corretamente usar o for update nowait > > para testar se um recurso está lockado, quando detectar que um > > registro/resource está lockado (recebendo o ORA-0054) a Aplicação ficar > > tentando e retentando o lock INDEFINIDAMENTE é falha - o correto ao invés > > seria LIMITAR a quantidade de vezes em que espera o lock ser liberado (via > > LOOP ** não-eterno **, repetido uma qtdade FIXA de vezes) E/OU limitar o > > período de tempo em que espera o lock já presente ser encerrado com o fim > > datransação que o criou... > > > > Agora entendi, é uma falha de Controle/Tratamento pela Aplicação no > > procedimento de LOCK NOWAIT, que em si está Corretíssimo e Não deveria > > causar espanto algum, ok... > > > > Muito bem, o que vc vai poder fazer aí a nível de banco de dados, Enquanto > > a Aplicação não tem essa falha corrigida é fazer no banco de dados o que a > > Aplicação não faz, ie, LIMITAR a duração de uma transação (e portanto > > limitar o tempo que um lock pode existir), OU então eliminar esses casos, o > > que poderia ser feito via : > > > > a) implementação algum tipo de timeout nas sessões (via PROFILE, talvez), > > para que uma sessão A que obteve um lock num dado recurso NÂO fique com > > transações abertas por tempo irrazoavelmente longo, assim limitando o tempo > > que B fica esperando pelo lock > > > > e/ou > > > > b) tendo um JOB no banco que a cada poucos x minutos consulta a V$SESSION > > e/ou a DBA_LOCKS e/ou views de WAIT, e se detectar espera muito longa por > > locks o JOB poderia mandar um e-mail para te avisar e/ou matar a sessão > > incial que implantou o lock (REGISTRANDO essa ação nalgum lugar, é Claro), > > coisa do tipo > > > > []s > > > > Chiappa > > > > > > --- Em oracle_br@yahoogrupos.com.br, JLSilva <jljlsilva@> escreveu > >> > >> Chiappa, o meu espanto é devido à lógica utilizada na aplicação. > >> Se o registro está lockado, o processo entra em um loop e tenta novamente > >> executar exatamente o mesmo select for update nowait para lockar o > >> registro. > >> O efeito cascata disso é que, ao fazer isto, a sessão A não libera os > >> registros anteriores e continua tentando lockar novos registros que estão > >> lockados pela sessão B. > >> Enquanto isso, a sessão B que está lockando outros registros, e em um > >> determinado momento, a sessão B vai tentar lockar o registro que está > >> lockado pela sessão A. > >> Se não fosse utilizado o "nowait" nesse select, ocorreria um deadlock, > >> pois A está locando o registro 1, B está locando o registro 2, A tenta > >> locar o registro 2 e B tenta locar o registro 1. > >> Mas, devido à forma que a aplicação foi construída, o deadlock nunca > >> ocorre, e a aplicação nunca vai sair desse loop. > >> Agora, imagine isto ocorrendo com muitas sessões (mais de 10 sessões). > >> Acaba que tem várias sessões lockando registros, elas não liberam esses > >> registros, e ficam tentando locar novos registros que já estão lockados > >> por outras, e ficam nesse loop. Fica impossível identificar quem está > >> lockando registros de quem. > >> Infelizmente, o fornecedor é daquele tipo difícil, e diz que "o sistema > >> está funcionando em 200 outros locais". Ok, mas aqui está ocorrendo esse > >> problema... > >> Mas, concordo com você. Desativar o nowait teria um resultado muito > >> imprevisível para o funcionamento do rdbms como um todo. > >> > >> On Mar 18, 2013, at 5:30 PM, "J. Laurindo Chiappa" <jlchiappa@> wrote: > >> > >>> Bom, vamos começar respondendo à sua pergunta : Não, em princípio afaik > >>> (salvo alguma alteração PESADA, não-suportada e EXTREMAMENTE perigosa de > >>> interferir no banco como um todo, tipo via parâmetros internos, OU então > >>> jogando-se o parâmetro de compatibility lá embaixo pra alguma versão > >>> antiga, etc ) no caso não há como vc alterar o comportamento do comando > >>> "SELECT FOR UPDATE NOWAIT", não... Aliás, de modo geral, Não Há como vc > >>> fazer um dado comando que está documentado agir assim ou assado agir de > >>> outro jeito, não... > >>> > >>> Isso respondido, observo que vc está "espantado" com a utilização, e nem > >>> imagino porque : veja vc, é ABSOLUTAMENTE normal e documentado (vide > >>> manual "Oracle® Database Advanced Application Developer's Guide" cap. 1 - > >>> SQL Processing for Application Developers , e algumas entradas sobre > >>> LOCKs no Concepts) que é EXATAMENTE ASSIM que vc "pergunta" se um > >>> registro está lockado ou não : vc tenta fazer um lock com NOWAIT e se der > >>> ORA-0054 ele tá lockado, se não der não está... Eu ABSOLUTAMENTE NÃO > >>> ENTENDI a sua "admiração", os "!!!" que vc colocou na msg, sim ???? > >>> Também Não Entendi porque vc quer mudar isso - é Absolutamente Normal que > >>> um recurso (tabela/registro/whatever) possa ser acessado em modo > >>> exclusivo, corretamente o teu Aplicativo CHECA isso, e vc quer remover > >>> esse check ?? Não entendo porque - diga para nós EXATAMENTE o que vc quer > >>> que a gente tenta sugerir algo.... > >>> > >>> []s > >>> > >>> Chiappa > >>> > >>> > >>> --- Em oracle_br@yahoogrupos.com.br, JLSilva <jljlsilva@> escreveu > >>>> > >>>> Senhores, boa tarde. > >>>> Temos uma aplicação de terceiros (CHB) que faz "select ... for update > >>>> ... NOWAIT". > >>>> Essa aplicação recebe o erro ORA-00054 e o tratamento que ela dá é: > >>>> tenta o select novamente!!!!!!! > >>>> Com isso, não ocorre o deadlock, nem consigo saber exatamente quem é o > >>>> bloqueador, pois há dezenas de sessões atualizando a mesma tabela. > >>>> Alguém aí sabe se é possível desativar o "nowait" através de algum > >>>> parâmetro/configuração do banco? > >>>> Obrigado! > >>>> > >>> > >>> > >>> > >>> > >>> ------------------------------------ > >>> > >>> -------------------------------------------------------------------------------------------------------------------------- > >>>> 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 > >>> > >>> > >> > > > > > > > > > > ------------------------------------ > > > > -------------------------------------------------------------------------------------------------------------------------- > >> 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 > > > > >