segunda-feira, 19 de março de 2012

Erro [ ORA-00060: Deadlock ] detectado

Senhores(as), boa tarde,
O erro ORA-00060, que identifica uma situação chamada de deadlock, ocorre quando dois ou mais processos de usuário do banco de dados não podem realizar suas transações, pois um processo está utilizando um recurso que o(s) outro(s) processo(s) requer(em). O Oracle detecta e resolve o deadlock gerado desfazendo (rollback) a transação que o detectou, segue abaixo documento para entendimento da situação e que sigam as recomendações para se evitar a ocorrência da mesma.

Detectando
O ORACLE automaticamente detecta situações de deadlock.
Quando detectado, o ORACLE automaticamente resolve um deadlock fazendo rollback de um dos comandos envolvidos no deadlock, liberando desta maneira um dos conjuntos de linhas conflitantes.
O ORACLE faz rollback do comando pertencente à transação que detectou o deadlock enviando a mensagem informativa “ORA-00060: Deadlock detected. More info in file filename”, aonde filename é um arquivo de trace que ajuda a identificar o cenário do deadlock
Deadlocks ocorrem mais frequentemente quando as transações explicitamente alteram o default locking do ORACLE:
SELECT ... FOR UPDATE OF - que permite que explicitamente se lock uma linha, ou um conjunto de linhas, antes de executar um update nessas linhas. Usado para garantir a consistência da alteração LOCK TABLE - que permite que se lock uma tabela antes de executar uma alteração nela. Usado para alteração massiva de linhas em uma única unidade.
Evitando
Devido ao Oracle não fazer lock escalation, não usar read locks para queries e usar lock a nível de linha, deadlocks raramente ocorrem no ORACLE.
Sendo assim a maioria dos deadlocks são ocasionados pelas aplicações, sendo na sua concepção ou no modelo de dados.
Porém, deadlocks podem frequentemente ser evitados se as transações acessando as mesmas tabelas, fazem lock destas tabelas na mesma ordem.
Para especificar uma sequência de lock, crie um rank para as tabelas, e as acesse sempre por esse rank em todos os sistemas aplicativos.
Uma outra situação aonde pode ocorrer deadlock é no caso da falta de índice para foreign key de uma tabela dependent cuja tabela parent é bastante atualizada , isto porque o default locking da tabela parent , neste caso , é alterado (Share Lock).




Qualquer dúvida, deixe seu comentário.


Nenhum comentário:

Postar um comentário