O que está bloqueando e como isso acontece?

20

Tentei encontrar algumas informações sobre o bloqueio no SQL Server, mas não consegui encontrar uma explicação concisa sobre o que é e como acontece. Poderia, por favor, me esclarecer?

jrara
fonte

Respostas:

23

Analogies

Às vezes, ajuda a usar analogias longe dos computadores.

Digamos que você tenha uma bola e dois filhos. Apenas uma criança pode ter a bola a qualquer momento. No entanto, se uma das crianças pega a bola e não a solta porque está distraída (assistindo TV, por exemplo), a outra criança não consegue brincar com a bola.

O outro filho é bloqueado desse recurso.

Se compararmos isso com a TV, por exemplo, várias crianças podem assistir TV a qualquer momento.

Fechaduras

Se passarmos para o mundo dos bancos de dados, veremos que existem diferentes maneiras de usar recursos (assim como nossos dois exemplos acima). Podemos realizar "leituras" ou "gravações".

Quando queremos ler os dados, não há razão para que outros também não possam ler os dados - assim como duas pessoas assistindo TV. No entanto, se queremos escrever os dados, precisamos garantir que ninguém mais os esteja olhando. Se eles estiverem lendo enquanto escrevemos, eles terão leituras "sujas". (Ou seja, eles verão os dados parcialmente gravados, o que será inválido.)

Para garantir que essas leituras sujas nunca ocorram, temos dois tipos principais de bloqueios, bloqueios de leitura e bloqueios exclusivos.

Bloqueio de leitura

Você pode ter várias conexões diferentes lendo da mesma fonte de dados a qualquer momento. Mas, para garantir que ninguém altere esses dados enquanto os lê, eles usam um bloqueio de leitura.

Depois que uma conexão tiver um bloqueio de leitura em um dado, todas as outras conexões deverão aguardar até que o bloqueio de leitura seja liberado para poder gravar os dados. Outros podem, no entanto, executar Read Locks por conta própria no mesmo pedaço de dados.

Bloqueio exclusivo

Se uma conexão deseja atualizar / inserir / excluir um dado, eles precisam executar um bloqueio exclusivo. Isso evita que qualquer outra conexão também bloqueie os dados (tornando o bloqueio exclusivo para essa conexão).

Quando uma conexão possui um bloqueio exclusivo nos dados, nenhuma outra conexão pode ler os dados. Isso ajuda a evitar leituras sujas, garantindo que ninguém possa ler os dados enquanto eles estão sendo gravados.

Bloqueio

"Bloqueio" é simplesmente um termo que significa que uma conexão está bloqueando um recurso quando outra conexão deseja ler ou gravar nele. Isso não significa necessariamente que a conexão do proprietário não a liberará, apenas que ela está atualmente em espera.

Compare isso com uma criança segurando a bola. A criança que segura a bola está impedindo que todas as outras crianças segurem a bola.

Impasse

Eu sei que você não perguntou isso, mas é apenas mais um passo para chegar a impasses (e está diretamente relacionado ao bloqueio).

Os bloqueios podem ocorrer quando você tem duas conexões, cada uma com um bloqueio, mas elas desejam um para o outro. Nesse cenário, é como dois filhos que cada um tem uma bola, mas quer a bola do outro.

Como as crianças, essas conexões não estão dispostas a compartilhar. Cada conexão precisa acessar os dois recursos para continuar. No entanto, eles estão em um estado de bloqueio permanente. Nesse estado, o pai (DBMS) precisa entrar e escolher um perdedor para que um dos filhos (conexões) possa ter acesso aos dois recursos.

Uma vez concluída a conexão "vencedora", ela libera os recursos e, em seguida, a outra conexão ("perdida") pode tentar novamente obter os dois recursos.

Portanto, o conceito de um impasse é onde você tem dois recursos que estão bloqueando um ao outro.


Aqui , você pode ler mais sobre todos os diferentes tipos de bloqueios que o SQL Server tem para oferecer e os diferentes recursos que podem causar bloqueios / deadlocks. O artigo é antigo, mas ainda se aplica ao SQL Server 2000 a 2008 R2. (Existem mais alguns tipos de bloqueios adicionados a versões posteriores do SQL Server, mas isso lhe dará um ponto de partida.)

Richard
fonte
11
@ Richard, como você mencionou se ocorrer um impasse, o DBMS entraria e escolheria um perdedor. Isso é feito automaticamente pelo DBMS? Ou um sistema mal projetado (um sistema que geralmente apresenta conflitos) será interrompido até que uma pessoa inicie o DBMS?
CenterOrbit 18/08
2
Para o SQL Server, isso é feito automaticamente (desde que o banco de dados possa detectar o impasse ). Pode ter problemas para detectá-lo se, por exemplo, for realmente um bloqueio ativo .
Richard
Resposta excelente e muito completa Richard. Um ponto adicional nos bloqueios ativos (que realmente não devem ser comparados ou relacionados a deadlocks, é apenas um bloqueio antigo) ... O SQL impedirá que bloqueios adicionais sejam executados onde um bloqueio exclusivo estiver aguardando, IIRC após 4 bloqueios compartilhados sucessivos e sucessivos.
Mark-Storey-Smith
5

Ótima explicação de Richard, mas só queria adicionar links à documentação oficial. Estes tópicos foram escritos para o SQL Server 2000, mas muitos dos conceitos permanecem os mesmos hoje:

Compreendendo e evitando o bloqueio

Noções básicas sobre bloqueio no SQL Server

Editar - algumas adições:

Todos os três são autores e / ou MVPs do SQL Server muito conhecidos.

Aaron Bertrand
fonte