ORACLE LOCKS

Verificando e resolvendo LOCKS.

Pergunta: Meu banco de dados está travado, parado, morto, sem responder mas o processamento não está alto! O que pode ser?
Responsta: LOCK!

Nos bancos de dados, ao executarmos alguma operação dml ( update, delete, insert, etc ) estamos travando os dados para a edição. Esta trava, que se chama LOCK, impede que outros usuários executem dml nos mesmos dados que estamos trabalhando e esta trava pode ocorrer ( basicamente ) de duas formas:

  • Lock a nível de linha: é quando travamos apenas o registro que estamos trabalhando, ou seja, mais de um usuário pode estar fazendo DML nas mesmas tabelas ao mesmo tempo.
  • Lock a nível de tabela: é quando travamos a tabela inteira, e não permitimos que nenhum outro usuário execute DML até finalizarmos nossa atividade.

O Oracle executa os locks a nível de registro, permitindo mais de um usuário alterar os dados de uma mesma tabela.
Você pode visualizar os Locks com o seguinte comando sql:

select * from v$lock;

( no SQLSERVER seria algo como sp_lock; )

No comando acima, você poderá visualizar todos os locks que estão ocorrendo no seu banco de dados neste momento.
Vamos melhorar a query e trazer mais informações 🙂

select 	p.spid,
	s.username,
	s.osuser,
	s.machine,
	p.program,
	l.lmode,
	l.block
from 	v$session s,
	v$process p,
	v$lock l
where	s.paddr = p.addr
and	l.sid = s.sid
and 	s.username is not null

Observe que vamos trazer várias informações do usuário ( safado ) que está “lockando” nosso banco, inclusive o PID do processo deste jovem.

Como resolver este LOCK?

Simples! Peça gentilmente para que seu usuário efetue COMMIT de suas alterações, ou mate a sessão dele 🙂
Matar a sessão pode ser feita de duas formas, usando ALTER SYSTEM KILL SESSION (tem um post explicando aqui no site) ou usando KILL no sistema operacional ( que é meu preferido hehehe ).

Só peço que atente para o fato de que nem todos os locks prejudicam os outros. Para descobrir qual usuário está bloqueando a galera veja a coluna BLOCK. Esta coluna informa ( quando maior que 0 ) se a sessão está bloqueando alguem.

Se for para matar alguém, mate o cara do BLOCK>0 !

=P

5 comentários sobre “ORACLE LOCKS”

Deixe uma resposta