Tá certo, chefe.
Obrigado.

On Mar 19, 2013, at 12:52 PM, "J. Laurindo Chiappa" <jlchia...@yahoo.com.br> 
wrote:

> Então, achei que estava claro mas pelo jeito não ficou : 
> 
> a) "será que existe uma forma de auxiliá-lo a melhorar a situação?".
> 
>  A ÚNICA forma segura e adequada é o Fornecedor corrigir a aplicação, não 
> ficando indefinidamente tentando lockar o objeto, PONTO. Enquanto isso não 
> ocorre, o que vc pode fazer como Paliativo é o
>  que eu indiquei em msgs anteriores, ie :
> 
>    1. SE vc quer serializar completamente (ie, se quando já há alguém 
> executando o processo vc quer que as outras sessões que tentem executar 
> simultaneamente falhem, com aviso) , vc pode ter alguma tela/programa que o 
> usuário executa antes de entrar na rotina e checa se a rotina já está em 
> execução em outra sessão , abortando
> 
>    2. SE não é serialização completa o que vc quer :
> 
>     - caso o processo chega a terminar depois de demorar muito, fazer algum 
> TUNING no processo para que ele termine o mais rapidamente possível e assim a 
> sessão A mantenha o lock o mínimo possível e libere o lock para a sessão B 
> processar, e B terminando o mais rápido possível libera o quanto antes C, 
> assim por diante
> 
>     e/ou
> 
>     - vc faz o que a aplicação não faz, ie, ENCERRA  a transação que está 
> demorando muito : para isso (provavelmente num job que rode a cada x 
> minutos), vc Identifica a sessão que obteve o lock , OU então coloca um 
> PROFILE limitando o tempo de conexão
> 
>     e é ISSO o quew vc pode fazer, sim ?? E como identificar os envolvidos, 
> vide abaixo...
> 
> 
> b)  "quem está bloqueando ***QUEM***"
> 
>  Esse é o ponto PRINCIPAL das minhas respostas, que pelo jeito não ficou 
> Claro : as outras sessões que estão num loop aguardando para obter o lock *** 
> NÂO ESTÃO BLOQUEADAS, elas estão acessando o objeto e tentando obter o lock, 
> mas ainda NÃO o obtiveram, sim ??? Não há LOCK WAIT aí, captou ??? Então, 
> para "quem está bloqueando" a resposta é, NINGUÉM, não há Bloqueio, não há 
> LOCK... E IMPORTANTE : como não há locks, não há uma FILA de espera, as n 
> sessões que estão acessando o objeto lockado para tentar obter o lock NÂO vão 
> ser atendidas por ordem, eu mostrei isso ...
>   O que há na verdade é ACESSO constante ao objeto que está lockado na 
> Tentativa de obter um lock, sim ??? E como vc identifica um objeto lockado ? 
> pelas views de lock, como mostrei.... Como vc identifica as sessões que estão 
> CONSTANTEMENTE, pesadamente, tentando e tentando e tentando acessar esse 
> objeto lockado ? Pelo evento de concorrência, como mostrei. E como vc SABE 
> que esse acesso constante é para obter lock com FOR UPDATE NOWAIT ?? Vc 
> consulta o SQL que está sendo enviado pelas sessões sofrendo de Concurrency E 
> confere se é o SELECT FOR UPDATE NOWAIT, okdoc ???
> 
>   Então ESSA é a resposta : não há bloqueio, há Acesso Constante a um objeto 
> bloqueado, e para Identificar esse cenário vc faz o que eu disse acima e 
> mostrei no meu exemplo, tá bem ?? Afora isso não sei realmente o que mais 
> dizer...
> 
>    []s
> 
>      Chiappa
> 
> --- Em oracle_br@yahoogrupos.com.br, JLSilva <jljlsilva@...> escreveu
>> 
>> 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" <jlchiappa@...> 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
>>> 
>>> 
>> 
> 
> 
> 
> 
> ------------------------------------
> 
> --------------------------------------------------------------------------------------------------------------------------
>> 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
> 
> 

Responder a