Tentei encontrar algumas informações sobre bloqueio no SQL Server, mas não consegui encontrar uma explicação concisa sobre o que é e como acontece. Você poderia por favor me esclarecer?
relate perguntas
-
SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado
-
Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?
-
Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?
-
Quais são as principais causas de deadlocks e podem ser evitadas?
-
Como determinar se um Índice é necessário ou necessário
Analogias
Às vezes ajuda usar analogias longe dos computadores.
Digamos que você tenha uma bola e dois filhos. Apenas uma criança pode ter a bola de cada vez. No entanto, se uma das crianças pegar a bola e não a soltar porque está distraída (assistindo TV, por exemplo), a outra criança não poderá brincar com a bola.
O outro filho está bloqueado desse recurso.
Se compararmos isso com a TV, por exemplo, várias crianças podem assistir TV em qualquer ponto.
Fechaduras
Se passarmos para o mundo do banco de dados, veremos que existem diferentes maneiras de usar os 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 não possam ler os dados também - assim como duas pessoas assistindo TV. No entanto, se quisermos gravar os dados, precisamos ter certeza de que ninguém mais está olhando para eles. Se eles estiverem lendo enquanto estamos escrevendo, eles terão leituras "sujas". (Ou seja, eles verão os dados parcialmente escritos, 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.
Uma vez que uma conexão tenha um bloqueio de leitura em um dado, todas as outras conexões devem esperar até que o bloqueio de leitura seja liberado antes que possam gravar os dados. Outros podem, no entanto, tirar seus próprios bloqueios de leitura nesse mesmo dado.
Bloqueio exclusivo
Se uma conexão deseja atualizar/inserir/excluir um dado, ela deve remover um bloqueio exclusivo. Isso impede que qualquer outra conexão também bloqueie os dados (tornando o bloqueio exclusivo para essa conexão).
Quando uma conexão tem 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 estão sendo gravados.
Bloqueio
"Bloquear" é simplesmente um termo que significa que uma conexão está mantendo um bloqueio em 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 a está mantendo no momento.
Compare isso com o caso de uma criança segurando a bola. A criança que segura a bola está impedindo todas as outras crianças de segurar a bola.
Impasse
Eu sei que você não perguntou isso, mas é apenas mais um passo para chegar aos impasses (e está relacionado muito diretamente ao bloqueio).
Os deadlocks podem acontecer quando você tem duas conexões, cada uma com um bloqueio, mas elas querem recursos uma da outra. Nesse cenário, é como duas crianças que cada uma tem uma bola, mas quer a bola da outra.
Como as crianças, essas conexões não estão dispostas a compartilhar. Cada conexão precisa de acesso a ambos os recursos para continuar. No entanto, eles estão em um estado de bloqueio permanente. Nesse estado, o pai (DBMS) deve entrar e escolher um perdedor para que um dos filhos (conexões) possa ter acesso a ambos os recursos.
Uma vez que a conexão "vencedora" é feita, ela libera os recursos e, em seguida, a outra conexão ("perdedora") pode tentar novamente obter os dois recursos.
Portanto, o conceito de deadlock é 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 a 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.)
Ótima explicação do Richard, mas só queria adicionar links para a documentação oficial. Esses tópicos foram escritos para o SQL Server 2000, mas muitos dos conceitos permanecem os mesmos hoje:
Entendendo e evitando o bloqueio
Entendendo o bloqueio no SQL Server
Editar - algumas adições:
Five Ways to Fight Blocking Video - um vídeo muito novo de Kendra Little (publicado hoje)
O DBA como Detetive: Solucionando Problemas de Bloqueio e Bloqueio - por Rodney Landrum
Como identificar problemas de bloqueio com o SQL Profiler - por Brad McGehee
Todos os 3 são autores e/ou MVPs muito conhecidos do SQL Server.