Início > Banco de Dados, Erros, Scripts, SQL Server, Virtual PASS BR > Deadlock no SQL Server

Deadlock no SQL Server

L&A Soluções – Consultoria em Banco de Dados SQL Server ( Suas informações em boas mãos! )

O que é Deadlock?
Deadlock (interbloqueio, blocagem, impasse), no contexto de banco de dados(MS-SQL/MySQL), caracteriza uma situação em que ocorre um impasse e dois ou mais processos ficam impedidos de continuar suas execuções, ou seja, ficam bloqueados.

O deadlock ocorre com um conjunto de processos e recursos não-preemptíveis, onde um ou mais processos desse conjunto está aguardando a liberação de um recurso por um outro processo que, por sua vez, aguarda a liberação de outro recurso alocado ou dependente do primeiro processo.

É comum em sites de noticias, onde a atualização é constante e, caso não se tenha uma boa estrutura de código, um processo pode acabar matando outro, deixando o site lento na horá do carregamento.

A definição textual de deadlock normalmente, por ser muito abstrata, é mais difícil de se compreender do que a representação por grafos, que será resumida mais adiante. No entanto, algumas observações são pertinentes:
– O deadlock pode ocorrer mesmo que haja somente um processo no banco de dados, considerando que este processo utilize múltiplos threads e que tais threads requisitem os recursos alocados a outros threads no mesmo processo;
– O deadlock independe da quantidade de recursos disponíveis no sistema;

Um exemplo onde erros de deadlock ocorrem é no banco de dados. Suponha que uma empresa tenha vários vendedores e vários pontos de venda/caixas. O vendedor A vendeu 1 relógio e 1 pulseira. O sistema então solicita o travamento do registro da tabela ESTOQUE que contém o total de relógios em estoque e em seguida solicita o travamento do registro que contém o total de pulseiras em estoque. De posse da exclusividade de acesso aos dois registros, ele lê a quantidade de relógios, subtrai 1 e escreve de novo no registro, o mesmo com o registro de pulseiras. Observe, no entanto que existem diversos caixas operando simultaneamente de forma que se algum outro caixa naquele exato instante estiver vendendo uma pulseira, ele ficará aguardando a liberação do registro das pulseiras para depois alterá-lo. Note que ele só altera os registro depois que for dada exclusividade para ele de TODOS os recursos que ele precisa, ou seja, de todos os registro. Suponha agora que em outro caixa foram vendidos 1 relógio e 1 pulseira e que o outro caixa solicitou o travamento do registro com a quantidade de pulseiras e agora quer o acesso ao de relógios, no entanto o de relógios está travado para o primeiro caixa. Nenhum deles devolve o recurso (registro) sobre o qual tem exclusividade e também não consegue acesso ao outro registro que falta para terminar a operação. Isto é um deadlock. +

Deadlock no SQL Server (Exemplo)

Uma obra de arte – DEADLOCK

———————————————————–

— Criando o Banco de Dados para Simulação
CREATE DATABASE DBDeadLock

— Utilizar o BD
USE DBDeadLock

— Criando as tabelas…
CREATE TABLE TbDeadCliente (
CdDeadCliente    int  identity(1,1) primary key
,    NmCliente           varchar(200)
,    EndCliente           varchar(200))

CREATE TABLE TbDeadPedido (
CdDeadPedido          int    identity(1,1) primary key
,    NmClientePedido   varchar(200)
,    EndClientePedido   varchar(200))

–drop table TbDeadCliente
–drop table TbDeadPedido

— Populando as tabelas
insert into TbDeadCliente values (‘Tiririca’, ‘Rua do Falcão, 76 – Majordisneylandia – Fortaleza’)
insert into TbDeadCliente values (‘Falcão’, ‘Rua do Adamastor, 24 – Testejana – Fortaleza’)
insert into TbDeadCliente values (‘Adamastor’, ‘Rua do Tiririca, 48 – Testelandia – Fortaleza’)
insert into TbDeadCliente values (‘Barnabé’, ‘Rua da Rosiclea’)
insert into TbDeadCliente values (‘Rosiclea’, ‘Rua do Barnabé’)

insert into TbDeadPedido values (‘Falcão’, ‘Rua do Adamastor, 24 – Testejana – Fortaleza’)
insert into TbDeadPedido values (‘Adamastor’, ‘Rua do Tiririca, 48 – Testelandia – Fortaleza’)

— Visualizar os dados das tabelas
SELECT * FROM TbDeadCliente
SELECT * FROM TbDeadPedido

— Criando as procedures para simulação
CREATE PROCEDURE sp_Atualiza1
AS
begin transaction
update    TbDeadCliente
set        EndCliente = ‘Rua da Rosiclea, 56A – SeiLáOnde – São Paulo’
where    CdDeadCliente = 4

waitfor delay ’00:00:05′

update    TbDeadPedido
set        EndClientePedido = ‘Rua do Tiririca, 48 – Uruarubina – Fortaleza’
where    CdDeadPedido = 2

waitfor delay ’00:00:05′
rollback
go

CREATE PROCEDURE sp_Atualiza2
AS
begin transaction
update    TbDeadPedido
set        EndClientePedido = ‘Rua do Tiririca, 48 – Uruarubina – Fortaleza’
where    CdDeadPedido = 2

waitfor delay ’00:00:05′

update    TbDeadCliente
set        EndCliente = ‘Rua da Rosiclea, 56A – SeiLáOnde – São Paulo’
where    CdDeadCliente = 4

waitfor delay ’00:00:05′
rollback

——————————————-
— Causando o DEAD LOCK —
——————————————-
— 1. Execute a sp_Atualiza1 em uma sessão;
EXECUTE sp_Atualiza1

— 2. Logo em seguida, execute a sp_Atualiza2 em uma outra sessão;
EXECUTE sp_Atualiza2

—————————————————-
— Mensagem de erro de deadlock —
—————————————————–
— (1 row(s) affected)
— Msg 1205, Level 13, State 51, Procedure sp_Atualiza2, Line 11
— A transação (ID do processo 72) entrou em deadlock em bloquear recursos com outro processo e foi escolhida como a vítima do deadlock. Execute a transação novamente.

— 3. Monitore via SQL Profiler caso queiram ver maiores detalhes…

  1. Nenhum comentário ainda.
  1. 19/08/2013 às 13:26
  2. 25/11/2013 às 14:07

Deixe uma resposta

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

%d blogueiros gostam disto: