Modos de bloqueio
O MicrosoftMecanismo de Banco de Dados do SQL Server bloqueia recursos que, usando diferentes modos de bloqueio, determinam como os recursos podem ser acessados por transações simultâneas.
A tabela a seguir mostra o recurso de modos de bloqueio que o Mecanismo de Banco de Dados utiliza.
Modos de bloqueio |
Descrição |
---|---|
Compartilhado (S) |
Usado para operações de leitura que não alteram ou atualizam dados, como uma instrução SELECT. |
Atualização (U) |
Usado em recursos que podem ser atualizados. Evita uma forma comum de deadlock que ocorre quando várias sessões estão lendo, bloqueando e potencialmente atualizando recursos mais tarde. |
Exclusivo (X) |
Usado para operações da modificação de dados, como INSERT, UPDATE ou DELETE. Assegura que várias atualizações não sejam realizadas no mesmo recurso e ao mesmo tempo. |
Intencional |
Usado para estabelecer uma hierarquia de bloqueio. Os tipos de bloqueios intencionais são: tentativa compartilhada (IS), exclusivo de tentativa (IX) e compartilhado com exclusivo de tentativa (SIX). |
Esquema |
Usado quando uma operação dependente do esquema de uma tabela está executando. Os tipos de bloqueios de esquema são: modificação de esquema (Sch-M) e estabilidade de esquema (Sch-S). |
Atualização em massa (BU). |
Usado quando para copiar dados em massa em uma tabela e a dica TABLOCK está especificada. |
Intervalo de chave |
Protege o intervalo de leitura de linhas lido por uma consulta ao usar o nível de isolamento da transação serializável. Assegura que outras transações não possam inserir linhas que se qualifiquem para consultas da transação serializável se as consultas forem executadas novamente. |
Bloqueios compartilhados
Bloqueios compartilhados (S) permitem que transações simultâneas leiam um recurso (SELECT) sob controle de simultaneidade pessimista. Para obter mais informações, consulte Tipos de controle de simultaneidade. Nenhuma outra transação pode modificar os dados enquanto bloqueios compartilhados (S) existirem no recurso. Bloqueios compartilhados (S) em um recurso são liberados quando a operação de leitura termina, exceto se o nível de isolamento da transação for configurado para leitura repetida ou maior ou uma dica de bloqueio for usada para reter os bloqueios compartilhados (S) pela duração da transação.
Bloqueios de atualização
Bloqueios de atualização (U) evitam que um formulário comum faça deadlock. Em uma transação serializável ou em leitura repetida, a transação lê os dados, adquire um bloqueio compartilhado (S) no recurso (página ou linha) e, então, modifica os dados, o que requer uma conversão para um bloqueio exclusivo (X). Se duas transações adquirem bloqueios em modo compartilhado em um recurso e tentam atualizar os dados simultaneamente, uma das transações tenta uma conversão do bloqueio para um bloqueio exclusivo (X). A conversão de bloqueio de modo compartilhado para exclusivo precisa esperar, porque o bloqueio exclusivo para uma transação não é compatível com o bloqueio em modo compartilhado da outra transação; ocorre uma espera por bloqueio. A segunda transação tenta adquirir um bloqueio exclusivo (X) para sua atualização. Como ambas as transações estão convertendo para bloqueios exclusivos (X), e ambas estão esperando pela outra transação liberar seu bloqueio em modo compartilhado, ocorre um deadlock.
Para evitar esse problema de potencial deadlock, são usados bloqueios de atualização (U). Só uma transação, de cada vez, pode obter um bloqueio de atualização (U) para um recurso. Se uma transação modificar um recurso, o bloqueio de atualização (U) será convertido para um bloqueio exclusivo (X).
Bloqueios exclusivos
Bloqueios exclusivos (X) evitam o acesso a um recurso através de transações simultâneas. Com um bloqueio exclusivo (X), nenhuma outra transação pode modificar os dados; operações podem ser realizadas só com o uso da dica NOLOCK ou nível de isolamento não confirmado.
Instruções de modificação de dados como INSERT, UPDATE e DELETE combinam operações de modificação e de leitura. A instrução primeiro executa as operações de leitura para adquirir dados, antes de executar as operações de modificação necessárias. Assim, as instruções de modificação de dados normalmente solicitam bloqueios compartilhados e bloqueios exclusivos. Por exemplo, uma instrução UPDATE poderia modificar linhas em uma tabela com base em uma junção com outra tabela. Nesse caso, a instrução UPDATE solicita bloqueios compartilhados nas linhas lidas na junção de tabela, além de solicitar bloqueios exclusivos nas linhas atualizadas.
Bloqueios intencionais
O Mecanismo de Banco de Dados usa bloqueios intencionais para proteger a colocação de um bloqueio compartilhado (S) ou bloqueio exclusivo (X) em um recurso inferior na hierarquia de bloqueio. Bloqueios intencionais são assim chamados porque eles são adquiridos antes de um bloqueio em um nível inferior, e dessa forma, sinalizam a intenção de colocar bloqueios em um nível inferior.
Os bloqueios intencionais têm duas finalidades:
Para evitar que outras transações modifiquem recursos de alto nível de uma forma que inviabilizaria o bloqueio em um nível inferior.
Para melhorar a eficiência do Mecanismo de Banco de Dados, detectando conflitos de bloqueio em um nível mais alto de granularidade.
Por exemplo, um bloqueio de tentativa compartilhado é solicitado no nível de tabela antes que os bloqueios compartilhados (S) sejam solicitados em páginas ou linhas dentro dessa tabela. Configurar um bloqueio intencional no nível de tabela evita que outra transação subseqüentemente adquira um bloqueio exclusivo (X) em uma tabela contendo essa página. Bloqueios intencionais aumentam o desempenho porque o Mecanismo de Banco de Dados examina os bloqueios intencionais somente no nível de tabela para determinar se a transação pode adquirir um bloqueio de forma segura nessa tabela. Isso remove a necessidade de examinar cada bloqueio de linha ou página na tabela para determinar se a transação pode bloquear a tabela inteira.
Os bloqueios intencionais incluem tentativa compartilhada (IS), exclusivo de tentativa (IX) e compartilhado com exclusivo de tentativa (SIX).
Modo de bloqueio |
Descrição |
---|---|
Tentativa compartilhada (IS) |
Protege bloqueios solicitados ou bloqueios compartilhados adquiridos em alguns (mas não todos) recursos mais baixos na hierarquia. |
Exclusivo de tentativa (IX) |
Protege os bloqueios solicitados ou bloqueios exclusivos adquiridos em alguns (mas não todos) recursos mais baixos na hierarquia. IX é um superconjunto de IS, e também protege solicitando bloqueios compartilhados em recursos de nível mais baixo. |
Compartilhado com exclusivo de tentativa (SIX) |
Protege bloqueios compartilhados solicitados ou adquiridos em todos os recursos inferiores na hierarquia e bloqueios exclusivos de tentativa em alguns (mas não todos) dos recursos de nível mais baixo. São permitido bloqueios IS simultâneos no recurso de nível mais alto. Por exemplo, adquirir um bloqueio SIX, em uma tabela, também adquire bloqueios exclusivos de tentativa nas páginas que estão sendo modificadas e bloqueios exclusivos nas linhas modificadas. Só pode haver um bloqueio SIX por recurso de cada vez, evitando atualizações feitas no recurso por outras transações, embora outras transações possam ler recursos, em uma hierarquia mais baixa, obtendo bloqueios IS no nível de tabela. |
Atualização da tentativa (IU). |
Protege os bloqueios solicitados ou bloqueios adquiridos atualizados, em todos os recursos mais baixos na hierarquia. Bloqueios de IU só são usados em recursos de página. Bloqueios IU são convertidos a bloqueios IX se houver uma operação de atualização. |
Atualização da tentativa compartilhada (SIU) |
Uma combinação de bloqueios S e IU, como resultado de aquisição desses bloqueios, separadamente e simultaneamente, mantendo ambos os bloqueios. Por exemplo, uma transação executa uma consulta com a dica PAGLOCK e, então, executa uma operação de atualização. A consulta com a dica PAGLOCK adquire o bloqueio de S e a operação de atualização adquire o bloqueio IU. |
Atualizar exclusivo da tentativa (UIX) |
Uma combinação de bloqueios U e IX, como resultado de aquisição desses bloqueios, separadamente e simultaneamente, mantendo ambos os bloqueios. |
Bloqueios de esquema
O Mecanismo de Banco de Dados usa esquema de bloqueios de modificação (Sch-M) durante a operação de definição de linguagem dos dados da tabela (DDL), tal como adicionar uma coluna ou cancelar uma tabela. Durante o tempo em ele é mantido, o bloqueio Sch-M evita o acesso simultâneo à tabela. Isso significa que o bloqueio Sch-M bloqueia todos as operações externas até que o bloqueio seja liberado.
Algumas operações DML (Data Manipulation Language), tais como truncamento da tabela, usam o bloqueio Sch-M para impedir o acesso à tabelas afetadas por operações simultâneas.
O Mecanismo de Banco de Dados usa bloqueios de estabilidade de esquema (Sch-S) quando compila e executa consultas. Os bloqueios de Sch-S não bloqueiam quaisquer bloqueios transacionais, inclusive bloqueios exclusivos (X). Assim sendo, outras transações, incluindo aquelas com bloqueios X em uma tabela, continuam executando enquanto a consulta é compilada. Porém, operações simultâneas DDL e operações simultâneas DML que adquirem bloqueios Sch-M, não podem ser executadas na tabela.
Bloqueios de atualização em massa
O Mecanismo de Banco de Dados usa bloqueios de atualização em massa (BU) quando copia dados em massa para uma tabela, e a dica TABLOCK é especificada na opção bloqueio de tabela para carregamento em massa é configurada usando sp_tableoption. Os bloqueios de atualização em massa (BU) permitem a vários threads carregarem simultaneamente dados em massa para a mesma tabela, evitando que outros processos, que não são carregamentos de dados em massa acessem a tabela.
Bloqueios de intervalo de chave
O bloqueio de intervalo de chaves protege uma gama de linhas, implicitamente incluídas em um conjunto de registros, que são lidas por uma instrução Transact-SQL , enquanto utiliza o nível de isolamento da transação serializável. O bloqueio de intervalos de chaves impede leituras fantasmas. Ao proteger os intervalos de chaves entre as linhas, ele também evita inserções fantasmas ou exclusões em um conjunto de registros acessado por uma transação.