Bloqueios no mecanismo de banco de dados

O bloqueio é um mecanismo usado pelo Microsoft Mecanismo de banco de dados do SQL Server para sincronizar o acesso de vários usuários à mesma parte dos dados simultaneamente.

Antes que uma transação adquira uma dependência de uma parte dos dados no estado atual, como por ler ou modificar os dados, ela deve se proteger contra os efeitos de outra transação que modifique os mesmos dados. A transação faz isso, solicitando um bloqueio na parte dos dados. Os bloqueios têm modos diferentes, como compartilhado ou exclusivo. O modo de bloqueio define o nível de dependência que a transação tem nos dados. Nenhuma transação pode receber um bloqueio que conflite com o modo de um bloqueio já atribuído àqueles dados por outra transação. Se uma transação requisitar um modo de bloqueio que conflite com um bloqueio que já tenha sido atribuído aos mesmos dados, a instância do Mecanismo de Banco de Dados fará uma pausa na transação requerida até que o primeiro bloqueio seja liberado.

Quando uma transação modifica uma parte dos dados, ela mantém o bloqueio protegendo a modificação até o fim da transação. O tempo que uma transação mantém os bloqueios adquiridos, para proteger as operações de leitura, depende da configuração do nível de isolamento da transação. Todos os bloqueios mantidos por uma transação são liberados quando a transação for concluída (confirma ou reverte).

Os aplicativos normalmente não solicitam bloqueios diretamente. Os bloqueios são administrados internamente por uma parte do Mecanismo de Banco de Dados chamado de gerenciador de bloqueio. Quando uma instância do Mecanismo de Banco de Dados processa uma instrução Transact-SQL, o Mecanismo de Banco de Dados processador de consulta determina quais recursos devem ser acessados. O processador de consulta determina que tipos de bloqueio são necessários para proteger cada recurso baseado no tipo de acesso e no nível configurado de isolamento da transação. O processador de consulta solicita os bloqueios apropriados ao gerenciador de bloqueio. O gerenciador de bloqueio concede os bloqueios, se não houver bloqueios conflitantes mantidos por outras transações.

A tabela seguinte lista os tópicos que descrevem os conceitos principais de bloqueio.

Tópico

Descrição

Bloqueio de granularidade e hierarquias

Os bloqueios podem ser solicitados a tipos diferentes de recursos, como linhas, páginas, índices, tabelas ou bancos de dados. Algumas operações necessitam que sejam colocados bloqueios em vários níveis de granularidade, formando uma hierarquia de bloqueios.

Modos de bloqueio

Os bloqueios têm diferentes modos, que especificam o nível de acesso que outras transações têm ao recurso bloqueado.

Compatibilidade de bloqueios (Mecanismo de Banco de Dados)

Várias transações poderão adquirir bloqueios simultâneos, no mesmo recurso, se os modos de bloqueio delas forem compatíveis. Se uma transação requisitar um modo de bloqueio conflitante com um bloqueio existente, a transação fará uma pausa até que o primeiro bloqueio seja liberado.

Bloqueio de intervalo de chave

Fechar um intervalo de chaves permite às transações que estão sendo executadas, no nível de isolamento serializável, evitar inserções fantasmas e exclusões.

Escalonamento de bloqueios (Mecanismo de Banco de Dados)

Se a transação adquirir um grande número de linhas ou bloqueio de página, o Mecanismo de Banco de Dados pode atribuir um bloqueio de tabela e, então, liberar todos os bloqueios no nível inferior para minimizar a sobrecarga de bloqueios.

Bloqueio dinâmico

O Mecanismo de Banco de Dados pode escolher de forma dinâmica o nível de granularidade de bloqueio, baseado na estimativa dada pelo otimizador do número de linhas que uma instrução Transact-SQL irá referenciar.

Exibindo informações de bloqueio (Mecanismo de Banco de Dados)

O Mecanismo de Banco de Dados e as APIs associadas fornecem vários mecanismos para mostrar informações sobre os bloqueios mantidos atualmente em uma instância do banco de dados.

Deadlock

Um deadlock acontece quando duas tarefas bloqueiam uma à outra permanentemente, porque cada tarefa tem um bloqueio em um recurso necessário à outra tarefa.