Em um ambiente multiusuário, é essencial manter a simultaneidade de truncamento. Esses bloqueios são estruturas na memória de 96 bytes de tamanho. Seu papel é manter a integridade dos dados, consistência e controle de simultaneidade para cada transação. O SQL Server segue o teste ACID para cada transação.
- A tomicity:essa propriedade garante que uma transação envolvendo dois ou mais processos seja totalmente confirmada ou que nenhum dos processos seja confirmado.
- C onsistency:Dá a você uma garantia sobre o estado da transação confirmada. Uma transação deve criar um novo estado de dados ou retornar ao estado existente (antes da transação).
- Eu solation:Indica que as transações estão isoladas umas das outras. Se uma transação estiver em execução e não confirmar dados, ela será isolada de outras transações.
- D urabilidade:A durabilidade garante que seus dados comprometidos nunca sejam perdidos. Ele evita falhas de energia e do sistema operacional ou outros erros induzidos por software.
Para garantir as propriedades ACID, o SQL Server impõe diferentes tipos de bloqueios nos objetos. Nesse caso, outras transações precisam aguardar até que o bloqueio seja liberado.
Modos de bloqueio
O SQL Server usa os seguintes modos de bloqueio para cada transação.
- Bloqueios compartilhados:
- Neste bloqueio, o SQL Server permite que outras sessões executem as operações selecionadas para leitura de dados. No entanto, impede atualizações até que o bloqueio esteja ativo.
- Várias transações podem impor um bloqueio compartilhado ao mesmo tempo em uma linha ou página.
- É um bloqueio comum que você vê em seus objetos de banco de dados.
No T-SQL a seguir, recuperamos o registro do cliente para um ID de cliente específico. Além disso, usamos a exibição de gerenciamento dinâmico sys.dm_tran_locks para verificar os bloqueios existentes.
BEGIN TRAN
SELECT * FROM [SalesLT].[Customer] WITH (HOLDLOCK)
WHERE CustomerID=1
SELECT resource_type, request_mode, resource_description
FROM sys.dm_tran_locks
WHERE resource_type <> 'DATABASE'
ROLLBACK
Conforme mostrado abaixo, ele tem um bloqueio compartilhado no ID do recurso fornecido (8194443284a0):
- Travas exclusivas (X):
- O SQL Server usa bloqueio exclusivo (X) para operações DML (Excluir, Inserir ou Atualizar), exigindo a modificação de dados de uma linha ou página.
- Impede que outros usuários acessem o recurso até que um bloqueio seja colocado.
- O SQL Server pode ter apenas um bloqueio exclusivo em uma página ou linha para uma transação.
Neste exemplo, queremos atualizar os registros do ID de cliente 1. Portanto, o SQL Server requer um bloqueio exclusivo no recurso. Nenhuma outra transação pode adquirir o bloqueio exclusivo neste recurso até que a transação seja concluída.
BEGIN TRAN
UPDATE [SalesLT].[Customer]
SET Suffix='Mr.'
WHERE CustomerID=1
SELECT resource_type, request_mode, resource_description
FROM sys.dm_tran_locks
WHERE resource_type <> 'DATABASE'
ROLLBACK
- Atualizar (U) bloqueios:
- O bloqueio de atualização é semelhante a um bloqueio exclusivo. Ele pode ser colocado em um registro com um bloqueio compartilhado.
- O bloqueio de atualização coloca outro bloqueio compartilhado em uma linha específica. Depois de modificar os registros, o SQL Server converte o bloqueio de atualização em um bloqueio exclusivo.
- O SQL Server não pode colocar um bloqueio compartilhado em um recurso com um bloqueio de atualização.
- Você também pode usar WITH UPDLOCK para forçar um bloqueio de atualização.
O exemplo a seguir mostra um bloqueio de atualização no ID do recurso (8194443284a0):
BEGIN TRAN
SELECT * FROM [SalesLT].[Customer] WITH (UPDLOCK)
WHERE CustomerID=1
SELECT resource_type, request_mode, resource_description
FROM sys.dm_tran_locks
WHERE resource_type <> 'DATABASE'
ROLLBACK
- Bloqueios de intenção:
- Sua finalidade é informar a uma transação sobre sua intenção de adquirir um bloqueio. Ocorre quando uma transação requer um bloqueio compartilhado ou exclusivo nos recursos inferiores na hierarquia.
- A transação não permite que outras transações obtenham um bloqueio exclusivo na tabela usando um bloqueio de intenção.
- Os tipos de bloqueios de intent estão abaixo.
- Bloqueio de intenção compartilhada (IS):indica a intenção do SQL Server de ler recursos de hierarquia inferior adquirindo bloqueio compartilhado individualmente nesses recursos de hierarquia inferior.
- Bloqueio exclusivo de intenção (IX):indica a intenção do SQL Server de modificar recursos de hierarquia inferior obtendo um bloqueio exclusivo nesses recursos de hierarquia inferior.
- Um bloqueio de atualização de intenção (IU):ele pode ser adquirido no nível da página apenas para recursos hierárquicos inferiores e, quando a atualização for concluída, ele será convertido em bloqueio IX.
Conforme mostrado abaixo, a transação possui um bloqueio exclusivo em uma chave e um bloqueio exclusivo Intent no nível da página.
Bloqueios de conversão
O SQL Server converte tipos de bloqueio para dar suporte a várias consultas em uma transação. Esses bloqueios são conhecidos como bloqueios de conversão.
- SIX – Shared with Intent Exclusive lock:A transação do SQL Server mantém um bloqueio compartilhado em várias páginas e tem um exclusivo bloquear em várias linhas.
- SIU – A transação do SQL Server mantém um bloqueio compartilhado em várias páginas e possui uma Atualização bloquear em várias linhas.
- UIX- Update with Intent Exclusive Lock:A transação do SQL Server mantém um bloqueio Update em várias páginas e tem um Exclusivo bloquear em várias linhas.
Bloqueios de esquema
O SQL Server adquire dois tipos de bloqueios de esquema.
- Bloqueio de estabilidade do esquema (Sch-S):Este bloqueio é usado quando a consulta dependente do esquema é compilada e seu plano de execução está sendo gerado. O bloqueio Sch-S não bloqueia nenhum acesso aos dados do objeto.
- Bloqueio de modificação de esquema (Sch-M):Este bloqueio resulta de uma execução de consulta DDL (Data Definition Language). O SQL Server pode ter apenas um bloqueio de modificação de esquema em um objeto. Você não pode modificar um objeto com este bloqueio de esquema.
No exemplo abaixo, obtemos os bloqueios Sch-S e Sch-M ao modificar uma definição de objeto.
BEGIN TRAN
Alter TABLE DemoTable ADD new bit
SELECT resource_type, request_mode, resource_description
FROM sys.dm_tran_locks
WHERE resource_type <> 'DATABASE'
ROLLBACK
Compatibilidade de bloqueio
A compatibilidade de bloqueio é útil para verificar bloqueios permitidos no caso de várias transações no mesmo recurso simultaneamente. Se uma transação colocar um bloqueio, o novo bloqueio colocado por outra transação deve ser compatível com ele. Portanto, você pode percorrer a lista de compatibilidade de bloqueio a seguir e encontrar bloqueios suportados durante várias transações.
Bloquear encaminhamentos
O SQL Server introduziu um recurso de escalonamento de bloqueio para evitar muito bloqueio que poderia causar pressão na memória. O SQL Server considera o número de bloqueios mantidos em uma verificação específica e o número de bloqueios mantidos por toda a transação e memória dinamicamente. O SQL Server converte bloqueios de baixo nível em bloqueios de alto nível no escalonamento de bloqueios. Por exemplo, ele converte bloqueios de linha em bloqueios de nível de página.
Ele usa o seguinte limite para escalações de bloqueio.
- Limite de memória: O limite de memória de bloqueio é definido em 40% da memória de bloqueio.
- Limite de bloqueio: Se o número de bloqueios adquiridos na tabela ou índice atual for maior que 5.000, os escalonamentos de bloqueio poderão ser acionados.
Os usuários podem controlar escalações de bloqueio usando a instrução alter table. Você pode desabilitar completamente o escalonamento de bloqueio para essa tabela usando um valor de parâmetro DISABLE.
ALTER TABLE Table_name SET (LOCK_ESCALATION = < TABLE | AUTO | DISABLE > –One of those options) GO
Você pode consultar a documentação da Microsoft para entender detalhadamente as escalações de bloqueio.
Observação:você não deve desabilitar o escalonamento de bloqueio até que ele seja completamente testado em um ambiente inferior e é recomendado que seja usado apenas por DBAs experientes.
Conclusão
Este artigo fornece uma visão geral detalhada dos bloqueios do SQL Server e DMV para monitorar o bloqueio e seu processo de escalonamento. O bloqueio é um comportamento bastante normal no SQL Server, e você deve estar familiarizado com ele para entender como várias transações funcionam, simulando e fornecendo dados consistentes.