Pular para o conteúdo
  • Este tópico contém 2 respostas, 3 vozes e foi atualizado pela última vez 15 anos, 4 meses atrás por antonioDBA.
Visualizando 3 posts - 1 até 3 (de 3 do total)
  • Autor
    Posts
  • #96821
    juracyajr
    Participante

      Pessoal,

      estou precisando de uma orientação URGENTE.
      Tenho uma ferramenta implantanda num cliente e quando o mesmo realiza 2 PROCEDIMENTOS pela ferramenta, estão ocorrendo locks do usuários.

      Identifico o lock, mas estou com dificuldade em achar que DML/PROCEDURE está gerando o lock. Pois estes procedimentos são executados através de diversas procedures e pacotes.
      Acredito, que o problema seja transações que não estão sendo finalizadas com COMMIT/ROLLBACK
      Consigo simular este problema em meu ambiente com 2 sessões.
      Assim uma estratégia que estou pensando em adotar é ligar a AUDITORIA e tentar identificar os comandos que geraram lock.
      Outra que estou pensando é em gerar os traces nas sessões e sair procurando.

      O que vocês acham?? Alguem tem alguma idéia que possa me ajudar ????
      Aproveitando, que view ou query posso obter OS últimos comandos SQL executados por uma sessão??? Não quero a atual, quero obter as últimas.

      Obrigado
      Juracy

      #96824
      Ishii
      Participante

        Olá,

        Se você consegue simular a situação, utilize a dba_locks e veja qual a sessão que está bloqueando e com ela você poderá saber qual exatamente o SQL que está gerando essa situação.

        []s Ishii

        #96826
        antonioDBA
        Participante

          Graça e Paz Juracy! Tudo bom?

          *Segue algumas orientações para evitar/eliminar esses lock’s:

          1º – Verifique junto ao desenvolvedor da ferramenta se o usuário do banco utilizado pela aplicação possui limite de tempo de transação configurado e se a instrução está comitando normalmente. Pois ao realizar esses ‘2 procedimentos’ o usuário da aplicação pode está realizando algum DML/Procedure que bloqueia tabelas/registros importantes para outras sessões, e se não for bem configurado o tempo limite de transação na aplicação/commit os dados alterados poderão correr o risco de não comitar em um tempo hábil e o oracle irá mantê-los bloqueados até o momento do commit. Gerando assim lock’s e até picos no banco.

          2º – Para localizar as últimas instruções de um determinado usuário do banco, você pode utilizar a view V$SQLAREA:

          SELECT SQL_TEXT “QUERY”,SQL_ID,PARSING_SCHEMA_NAME “USUARIO”,MODULE “PROGRAMA”,EXECUTIONS “EXECUÇÕES”
          ,FIRST_LOAD_TIME “PRIMEIRA CARGA”, LAST_LOAD_TIME “ULTIMA CARGA” FROM V$SQLAREA
          WHERE PARSING_SCHEMA_NAME = ‘NOME_DO_USUÁRIO’

          3º – Ou para localizar a query corrente de um usuário:
          SELECT T.SQL_TEXT
          FROM V$SQLTEXT T, V$SQLAREA A
          WHERE (A.ADDRESS, A.HASH_VALUE) IN
          (SELECT SQL_ADDRESS, SQL_HASH_VALUE
          FROM V$SESSION
          WHERE USERNAME LIKE ‘NOME_DO_USUARIO’)
          AND A.HASH_VALUE = T.HASH_VALUE
          ORDER BY T.PIECE

          4º – E para localizar o usuário que está gerando os locks:
          SELECT BLOCKING_INSTANCE,BLOCKING_SESSION,SID,SERIAL#,USERNAME,OSUSER,MACHINE
          FROM V$SESSION WHERE BLOCKING_SESSION IS NOT NULL


          Grande abraço,

          Fica com Deus!

          Antonio Campos

        Visualizando 3 posts - 1 até 3 (de 3 do total)
        • Você deve fazer login para responder a este tópico.