- Este tópico contém 2 respostas, 3 vozes e foi atualizado pela última vez 15 anos, 4 meses atrás por
antonioDBA.
-
AutorPosts
-
11 de novembro de 2010 às 2:58 am #96821
juracyajr
ParticipantePessoal,
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
Juracy11 de novembro de 2010 às 2:50 pm #96824Ishii
ParticipanteOlá,
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
11 de novembro de 2010 às 3:59 pm #96826antonioDBA
ParticipanteGraç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.PIECE4º – 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
-
AutorPosts
- Você deve fazer login para responder a este tópico.