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