Locks, blocks e deadlocks

Nesse artigo, vou explicar o que são e como funcionam locks, blocks e deadlocks.
Um dos papéis principais de um SGBD é gerenciar as diversas conexões simultâneas a um database. Isso é chamado de Concorrência. Para evitar que ocorram conflitos no acesso simultâneo a um mesmo dado, o SQL Server implementa um mecanismo para “simular” os acessos simultâneos com sucesso. Esse mecanismo chama-se Locks.
Lock é um mecanismo para bloquear a alteração de um mesmo dado, originada por diversas conexões. Quando é criada uma requisição de acesso a um determinado dado em um database, o SQL Server garante à essa requisição o acesso irrestrito (lock) ao dado, evitando a possibilidade de corrupção do dado ou um erro do sistema.
Existem 2 tipos de locks:

Shared lock: shared locks são criados quando uma requisição de leitura é enviada a um objeto. Múltiplos shareds locks podem ser emitidos a um mesmo objeto, permitindo que mais de um processo possa ler o dado.
Exclusive lock: irá “lockar” o objeto, para que ele possa ser modificado, e irá bloquear todas as demais requisições ao mesmo objeto, seja de leitura ou modificação.

Locks podem ocorrer a nível de linhas, páginas de dados e tabelas.

BLOCKS

um block ocorre quando um processo tem um lock em um recurso, e não irá permitir que outros processos usem o mesmo recurso. Este tipo de comportamento é uma parte normal das operações do database e a frequencia com que ocorrerão está ligada diretamente com os recursos disponíveis.

Exemplo: quando os blockings são minimizados e o servidor possui recursos suficientes para ter um grande número de usuários conectados (alta concorrência). Em contrapartida, quando há um grande número de blockings e os recursos do servidor não são suficientes para suportar as requisições, chamamos de baixa concorrência.
O ambiente ideal é que o tempo de duração dos blocks sejam curtos, algo em torno de 1 segundo.

DEADLOCKS

Diferente dos blocks, um deadlock ocorre quando o processo 1 cria um lock no recurso A e o processo 2 cria um lock no recurso B. Quando o processo 1 tenta acessar o recurso B, e o processo 2 tenta acessar o recurso A, é criado um deadlock:

Deadlock

Diferente dos blocks, que serão finalizados normalmente pelo SQL Server, para eliminar um deadlock pode-se definir na querie a instrução SET DEADLOCK_PRORITY, criando com isso uma prioridade no processo e permitindo ao SQL Server finalizar a operação. Outra forma de eliminar um deadlock é através da ferramenta Activity Monitor e identificar uma querie que esteja com o status suspended.

Para exemplificar, irei simular uma situação de deadlock, utlizando o database de exemplo, disponibilizado pela Microsoft, Adventureworks. Esse e outros databases de exemplo podem ser obtidos diretamente no site Codeplex.

No SQL Server Management Studio, abra uma tela para executar uma nova querie e digite o seguinte comando:

USE AdventureWorks
GO
BEGIN TRANSACTION
UPDATE Person.Contact SET FirstName = ‘Cal’
WHERE ContactID = 1;
GO

Abra uma nova tela do query editor e execute a instrução abaixo:

USE AdventureWorks
GO
BEGIN TRANSACTION
UPDATE Production.Product SET ProductNumber = ‘TP-8542’
WHERE ProductID = 1;
UPDATE Person.Contact SET LastName = ‘Stewart’
WHERE ContacID = 1;
GO

Ao executar o comando acima, perceba que ele não finaliza, fica executando sem finalizar. Para visualizar o deadlock, abra o Activity Monitor e identifique um processo parecido com o demonstrado na imagem abaixo:

Querie Suspended

Não elimine o processo. Vá para a tela onde foi executada a primeira query e execute a seguinte instrução:

UPDATE Production.product SET Name = ‘Faixa Azul’
WHERE ProductID = 1;

Após executar o comando, você receberá uma tela com o seguinte erro:

Para eliminar o deadlock, abra a Activity Monitor e clique com o botão direito do mouse no processo e selecione KILL PROCESS.

Com isso finalizo o artigo sobre Locks, blocks e deadlocks.

Abraços e até a próxima.

Anúncios

10 comentários sobre “Locks, blocks e deadlocks

  1. Pingback: Exemplo de Deadlock no SQL Server « Alex Souza

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s