AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 4760
Accepted
jrara
jrara
Asked: 2011-08-19 04:41:54 +0800 CST2011-08-19 04:41:54 +0800 CST 2011-08-19 04:41:54 +0800 CST

O que é bloqueio e como isso acontece?

  • 772

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?

sql-server locking
  • 2 2 respostas
  • 26317 Views

2 respostas

  • Voted
  1. Best Answer
    Richard
    2011-08-19T05:05:36+08:002011-08-19T05:05:36+08:00

    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.)

    • 24
  2. Aaron Bertrand
    2011-08-19T08:35:24+08:002011-08-19T08:35:24+08:00

    Ó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.

    • 5

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

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve