Deadlocks em bancos de dados

Escrito por Marcos Kirchner em 8 de fevereiro de 2010, 09:03h

Um deadlock é uma situação que ocorre quando dois processos aguardam para utilizar um recurso que está sendo utilizado pelo outro processo, ou quando mais de dois processos estão aguardando por recursos de forma circular. Esta situação pode ocorrer com qualquer tipo de processos que compartilhem recursos mutuamente exclusivos, mas é relativamente comum em bancos de dados. O objetivo deste post é clarificar esta situação e apresentar alguns exemplos.

Durante as modificações de dados, os bancos de dados utilizam bloqueios (locks) para garantir que outros processos não modifiquem/consultem os mesmos dados simultaneamente. Quando um processo precisa acessar algum dado que está bloqueado por outro processo, o primeiro deve aguardar até que o segundo conclua suas operações. Este bloqueio é normal e necessário, e não caracteriza um deadlock. Quando o segundo processo concluir suas operações os bloqueios serão liberados e o primeiro processo continuará executando normalmente. Um deadlock ocorre somente quando nenhum dos dois (ou mais) processos envolvidos pode continuar sua execução sem intervenção externa.

Deadlocks também podem ocorrer nos bancos de dados com recursos como memória e threads, mas o mais comum é envolvendo locks. Normalmente os sistemas gerenciadores de bancos de dados possuem mecanismos para detectar e resolver deadlocks.

Abaixo um exemplo simples utilizando o SQL Server. O primeiro processo (tela com fundo preto) realiza uma alteração no nome do cliente 1, que ocorre normalmente:

Processo 1

Um outro processo (tela com fundo azul) realiza uma alteração no nome do cliente 2, com sucesso. Em seguida tenta alterar o nome do cliente 1:

Processo 2

Neste momento o segundo processo fica bloqueado, pois o cliente 1 está sendo alterado pelo primeiro processo. Aqui não há deadlock, pois o processo 1 pode concluir suas alterações (COMMIT/ROLLBACK), liberando assim o processo 2. No entanto, se neste momento o processo 1 tentar alterar o cliente 2, haverá um deadlock:

Processo 1

O processo 1 estava bloqueando o cliente 1 e esperando para alterar o cliente 2. O processo 2 estava bloqueando o cliente 2 e esperando para alterar o cliente 1. Ambos os processos estavam aguardando por um recurso que estava bloqueado pelo outro, e nenhum dos dois poderia continuar. O software gerenciador de banco de dados detectou o deadlock e abortou (ROLLBACK) uma das transações (erro 1205 na tela acima), fazendo com que a outra transação pudesse continuar.

O mecanismo de detecção de deadlocks e as mensagens de erro variam de acordo com o banco de dados. No Oracle, o seguinte erro é gerado quando um deadlock é detectado:

ORA-00060: deadlock detected while waiting for resource

Nem todos os gerenciadores de bancos de dados implementam um mecanismo de detecção de deadlocks. O Progress OpenEdge, por exemplo, não implementa. Em um banco de dados OpenEdge, quando um usuário fica bloqueado ele recebe uma indicação visual, informando que o registro está bloqueado por outro usuário:

Informação de registro bloqueado no OpenEdge

Como não há controle de deadlock, é possível que dois ou mais usuários recebam esta mesma mensagem, e fiquem um esperando pelo outro.

Existem técnicas para minimizar a ocorrência de deadlocks em bancos de dados. Normalmente a própria documentação dos bancos de dados contém informações mais detalhadas sobre o assunto. Consulte sua documentação para mais detalhes.

Categorias: Banco de dados

Comentar




biuquote
  • Comentário
  • Pré-visualização
Loading