Chiappa, gosto muito do nível de detalhes que vc responde, colocando bons exemplos e sempre muito úteis. Mas, vejo que você apenas está repetindo o que eu disse na minha primeira mensagem. Parafraseando seu modo de escrever: Eu ***JÁ*** sei que é um select for update nowait. Ja identifiquei isto, por isso enviei o meu primeiro email, pois não tenho como evitar qua a aplicação faça o que está fazendo. Eu ***JÁ*** sei que é a aplicação que ***********DEVERIA************ encerrar a transação. Mas, com eu ***JÁ*** disse: a aplicação ***NÃO O FAZ***. Eu achei que tinha deixado claro qual era a minha intenção ao perguntar se alguém conhece uma maneira de desativar um nowait: a aplicação está fazendo caca, e o cliente está sofrendo a consequencia, portanto "será que existe uma forma de auxiliá-lo a melhorar a situação?".
O que eu gostaria de responder é: Quem está bloqueando ***QUEM*** (não "oque", ok?) O "que" está esperando eu já sei, é uma determinada tabela. O problema é descobrir a ordem dessa fila, para fazer o deadlock manualmente e adequadamente. Ok? On Mar 18, 2013, at 9:16 PM, "J. Laurindo Chiappa" <jlchia...@yahoo.com.br> wrote: > 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 >>> >>> >> > > > > > ------------------------------------ > > -------------------------------------------------------------------------------------------------------------------------- >> 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 > >