Locks, Blocks e Deadlocks – Qual a diferença?

Muitas vezes somos questionados pelos desenvolvedores sobre locks, blocks e deadlocks e, quase sempre, eles fazem o uso errado desses termos, em outras vezes, eles nem fazem ideia do que estamos falando. Acredito que a grande confusão ocorra pela similaridade dos dois primeiros termos (Block e Lock), porque, quando traduzidos para o português, resultam em Bloqueio.

A seguir, tentarei explicar cada um dos termos. Utilizarei algumas vezes os termos em inglês para que não existam confusões.

LOCKS

Os locks ocorrem quando um processo acessa uma parte dos dados onde existe a possibilidade de que outro processo concorrente também precise desses dados ao mesmo tempo. Ao realizar o lock dos dados, fica garantido que a operação agirá da forma esperada, como por exemplo, um select sem o uso do NOLOCK, ou os inserts, updates e deletes. O lock garante que, no momento que a query entra em execução, nenhuma informação abrangida por ela, será alterada por outro processo que se utilize dos dados envolvidos nessa query.

Os locks são normais e é mecanismo usado pelos SGBDs para protegerem a integridade dos dados durante as transações. Dependendo de infraestrutura e de características da aplicação, podem ocorrer milhares de locks por segundo em um banco de dados.

Uma analogia para o lock, seria um sinal vermelho aceso em um cruzamento.

 

BLOCKS

O block  ocorre quando dois processos precisam acessar o mesmo fragmento de dados simultaneamente, de modo que um processo faz o lock dos dados e o outro precisa esperar que o outro conclua e libere o lock, ficando blocked. Assim que o primeiro processo for concluído, o processo blocked retoma a operação. A cadeia de blocks é como uma fila: assim que o processo em lock estiver concluído, os processos em block podem continuar. Em um ambiente de servidor normal, blocks pouco frequentes são aceitáveis, mas se eles forem muito comuns, provavelmente existem problemas de design ou de implementação de queries, sendo que o block pode estar

causando problemas de performance, ou, em casos extremos, parada da instância do banco de dados, por falta de recursos.

Uma situação de block NÃO pode ser resolvida por si só (ou seja, se o processo de lock não concluiu a transação corretamente e mantém outros processos em block) ou pode levar muito tempo para ser concluído. Nessas situações extremas, o processo em lock precisa ser eliminado e / ou redesenhado.

Uma analogia para o block, seria um veículo esperando o sinal verde em um cruzamento.

DEADLOCK

O deadlock ocorre quando um processo entra em block e espera por um segundo processo para concluir seu trabalho e liberar os locks, enquanto o segundo processo ao mesmo tempo entra em block e espera que o primeiro processo libere o lock, ou seja, existe uma dependência cruzada entre eles, que nunca será resolvida.

Em uma situação de deadlock, os processos já estão bloqueando um ao outro, portanto, é necessário que haja uma intervenção externa para resolver o impasse. Por esse motivo, os SGBDs possuem mecanismos de detecção e resolução de conflitos, em que um processo precisa ser escolhido como “vítima de deadlock” e ser eliminado para que o outro processo possa continuar funcionando. O processo escolhido como vítima recebe uma mensagem de erro muito específica indicando que ele foi escolhido como uma vítima de deadlock, podendo o processo ser reiniciado por meio do código com base nessa mensagem de erro.

Os deadlocks são considerados uma situação crítica no mundo do banco de dados, porque os processos estão sendo mortos automaticamente. Os deadlocks são resolvidos pelo SGBD e não precisam de intervenção manual.

Os deadlocks podem e devem ser evitados. Como fazer isso? Analisando as situações em que ocorrem os deadlocks, entendendo as razões e corrigindo a programação ou o processo.

É fácil resolver problemas de deadlock? Lógico que não! Se fosse fácil, qualquer um resolveria e não teriam necessidade de contratar profissionais qualificados.

A analogia para os deadlocks é um cruzamento sem sinal de trânsito, onde todos tentam passar ao mesmo tempo e ninguém consegue porque um trava o outro.

SCRIPTS

Com a colaboração de dois integrantes do grupo DBA BRASIL, estamos publicando scripts para identificar os locks & blocks no SQL Server.

 

 

Este SCRIPT foi enviado pelo Cesar Mulotto.

 

 

 

 

 

 

Este SCRIPT foi enviado pelo Wiluey Queiroz.

 

4 comentários em “Locks, Blocks e Deadlocks – Qual a diferença?

  • 9 de novembro de 2018 em 17:57
    Permalink

    Olá Cotrim parabéns por compartilhar um pouco dos seus, muito interessante seu este assunto, e as imagens muita interessante.
    Valeu!!!!!!!!!!!

    Resposta
  • 10 de novembro de 2018 em 15:32
    Permalink

    Parabéns Cotrim pelas explicações, a última foto representa muito bem um deadlock 🙂

    Resposta
  • 28 de novembro de 2018 em 10:49
    Permalink

    Excelente explicação … muito fácil de entender

    Resposta

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.