Ícone do site CooperaTI

Quando o banco apresenta um DeadLock o que fazer?

Olá, Galera!  Nesse artigo, falarei de umas das coisas que podem parar até o seu banco de dados de funcionar, o DeadLock.
O Deadlock, ocorre quando duas ou mais tarefas bloqueiam uma à outra
permanentemente, sendo que cada uma tem o bloqueio de um recurso, que
a outra tarefa está tentando bloquear.
Muitos dos artigos que encontramos, só nos fala de como identificar o problema. Aqui tentarei abordar como resolver o problema de maneira fácil. Para identificar um DeadLock no banco é necessário saber, qual usuário está causando tal problema.
Realizando a consulta para saber o Id do usuário:
Select a1.sid, ‘ esta bloqueando ‘, a2.sid
From v$lock a1, v$lock a2
Where a1.block = 1
And a2.request > 0
And a1.id1=a2.id1
And a1.id2=a2.id2
Realizando a consulta da sessão do id que está causando o Lock:
select sid, serial#
from v$session
where sid = 999;
Aqui coloquei o sid como 999, mas você trocará pelo sid que retornar na primeira consulta.Vamos agora matar o sid_number e o serial _number.
ALTER SYSTEM KILL SESSION ‘sid_number, serial_number’;
Nesse sql, troque o “sid_number” e o “serial_number”, pelos que a consulta anterior retornou, realizando assim o kill da Id que está dando lock na base.
Verifique agora se a sessão está realmente morta (killed), rodando a consulta abaixo:
select sid, status
from v$session
where sid=999;
Retornando nada, a operação foi concluída com êxito. Mas, caso retorne ainda a linha de lock, devemos seguir mais alguns procedimentos. Vamos identificar a sessão do processo do sistema operacional que toma conta da sessão. Temos que ter cuidado quando se usa o dispatchers.
Identificando a sessão
select spid
from v$process
where addr=(select paddr from v$session where sid=999);
 
Quando identificamos o processo, vamos ao shell do linux ou do unix como administrador root e:
kill -9 9999
Lembrando que o valor 9999, corresponde ao valor retornado para o SPID da consulta anterior.
Agora amigo, caso ainda continue a sessão ativa, é bom irmos para um último recurso.
Eliminando a sessão:
ALTER SYSTEM DISCONNECT SESSION ‘sid_number,serial_number’ IMMEDIATE;
Pronto estará finalizado a tarefa de eliminar a sessão do DeadLock.
Abraços e espero ter ajudado.
Créditos: Carlos Gomes – http://www.linkedin.com/pub/carlos-alberto-gomes/2a/965/57a

Sair da versão mobile