Compartilhar via


Comportamento de bloqueio no Parallel Data Warehouse

Entenda como o Parallel Data Warehouse usa o bloqueio para garantir a integridade das transações e manter a consistência dos bancos de dados quando vários usuários estão acessando os dados ao mesmo tempo.

Noções básicas de bloqueio

Modos

O SQL Server PDW permite quatro modos de bloqueio:

Exclusivo
O bloqueio Exclusivo proíbe a gravação ou leitura do objeto bloqueado até que a transação que contém o bloqueio Exclusivo seja concluída. Nenhum outro bloqueio de qualquer modo é permitido enquanto o bloqueio Exclusivo estiver em vigor. Por exemplo, DROP TABLE e CREATE DATABASE usam um bloqueio Exclusivo.

Compartilhado
O bloqueio Compartilhado proíbe o início de um bloqueio Exclusivo no objeto afetado, mas permite todos os outros modos de bloqueio. Por exemplo, a instrução SELECT inicia um bloqueio Compartilhado e, portanto, permite que várias consultas simultâneas acessem os dados selecionados, mas impede que as atualizações dos registros sejam lidas até que a instrução SELECT seja concluída.

ExclusiveUpdate
O bloqueio ExclusiveUpdate proíbe a gravação no objeto bloqueado, mas permite a leitura pelo bloqueio Compartilhado. Nenhum outro bloqueio é permitido enquanto o bloqueio ExclusiveUpdate estiver em vigor. Por exemplo, BACKUP DATABASE e RESTORE DATABASE usam um bloqueio ExclusiveUpdate.

SharedUpdate
O bloqueio SharedUpdate proíbe os modos de bloqueio Exclusivo e ExclusiveUpdate e permite os modos de bloqueio Compartilhado e SharedUpdate no objeto. SharedUpdate modifica um objeto, mas não restringe o acesso de leitura a ele durante a modificação. Por exemplo, INSERT e UPDATE usam um bloqueio SharedUpdate.

Classes de recursos

Os bloqueios são mantidos nas seguintes classes de objetos: DATABASE, SCHEMA, OBJECT (uma tabela, exibição ou procedimento), APPLICATION (usado internamente), EXTERNALDATASOURCE, EXTERNALFILEFORMAT E SCHEMARESOLUTION (um bloqueio de nível de banco de dados feito durante a criação, alteração ou descarte de objetos de esquema ou usuários de banco de dados). Essas classes de objeto podem aparecer na coluna object_type de sys.dm_pdw_waits.

Comentários gerais

Os bloqueios podem ser aplicados a bancos de dados, tabelas ou modos de exibição.

O SQL Server PDW não implementa nenhum nível de isolamento configurável. Ele permite o nível de isolamento READ_UNCOMMITTED, conforme definido pelo padrão ANSI. No entanto, como as operações de leitura são executadas sob READ_UNCOMMITTED, muito poucas operações de bloqueio ocorrem ou levam à contenção no sistema.

O SQL Server PDW depende do mecanismo subjacente do SQL Server para implementar o controle de simultaneidade e bloqueio. Se as operações resultarem em um deadlock subjacente do SQL Server no mesmo nó, o SQL Server PDW aproveitará a capacidade de detecção de deadlock do SQL Server e encerrará uma das instruções de bloqueio.

Observação

O SQL Server não permite que instruções aguardando bloqueios sejam bloqueadas por solicitações de bloqueio mais recentes. O SQL Server PDW não implementou totalmente esse processo. No SQL Server PDW, solicitações contínuas para novos bloqueios compartilhados às vezes podem bloquear uma solicitação anterior (mas aguardando) de um bloqueio exclusivo. Por exemplo, uma instrução UPDATE (que requer um bloqueio exclusivo) pode ser bloqueada por bloqueios compartilhados que são concedidos para séries de instruções SELECT. Para resolver um processo bloqueado (identificado pela revisão do DMV sys.dm_pdw_waits), ele para de enviar novas solicitações até que o bloqueio exclusivo seja finalizado.

Tabela de definição de bloqueio

O SQL Server dá suporte aos seguintes tipos de bloqueios: Nem todos os tipos de bloqueio estão disponíveis no nó de controle, mas podem ocorrer nos nós de computação.

  • Sch-S (Estabilidade do esquema). Assegura que um elemento de esquema, como uma tabela ou índice, não seja cancelado enquanto qualquer sessão mantém o bloqueio de estabilidade do esquema no elemento do esquema.

  • Sch-M (Modificação do esquema). Deve ser mantido por qualquer sessão que desejar alterar o esquema do recurso especificado. Assegura que nenhuma outra sessão esteja fazendo referência ao objeto indicado.

  • S (Compartilhado). A sessão mantenedora possui acesso compartilhado ao recurso.

  • U (Atualizar). Indica um bloqueio de atualização adquirido em recursos que podem ser atualizados eventualmente. É usado para evitar uma forma comum de deadlock que ocorre quando várias sessões bloqueiam recursos para uma atualização potencial no futuro.

  • X (Exclusivo). A sessão mantenedora possui acesso exclusivo ao recurso.

  • IS (Tentativa compartilhada). Indica a intenção de colocar bloqueios S em algum recurso subordinado na hierarquia de bloqueio.

  • IU (Atualização da tentativa). Indica a intenção de colocar bloqueios U em algum recurso subordinado na hierarquia de bloqueio.

  • IX (Intensão exclusiva). Indica a intenção de colocar bloqueios X em algum recurso subordinado na hierarquia de bloqueio.

  • SIU (Atualização da tentativa compartilhada). Indica o acesso compartilhado a um recurso com a intenção de adquirir bloqueios de atualização em recursos subordinados na hierarquia de bloqueio.

  • SIX (Exclusivo da tentativa compartilhada). Indica o acesso compartilhado a um recurso com a intenção de adquirir bloqueios exclusivos em recursos subordinados na hierarquia de bloqueio.

  • UIX (Atualizar exclusivo da tentativa). Indica a manutenção de um bloqueio de atualização de um recurso com a intenção de adquirir bloqueios exclusivos em recursos subordinados na hierarquia de bloqueio.

  • BU. Usado por operações em massa.

  • RangeS_S (Intervalo de chave compartilhada e bloqueio de recurso compartilhado). Indica varredura de intervalo serializável.

  • RangeS_U (Intervalo de chave compartilhada e bloqueio de recurso de atualização). Indica verificação de atualização serializável.

  • RangeI_N (Intervalo de chave de inserção e bloqueio de recurso nulo). Usado para testar intervalos antes de inserir uma nova chave em um índice.

  • RangeI_S. Bloqueio de conversão de intervalo de chave criado por uma sobreposição dos bloqueios RangeI_N e S.

  • RangeI_U. Bloqueio de conversão de intervalo de chave criado por uma sobreposição dos bloqueios RangeI_N e U.

  • RangeI_X. Bloqueio de conversão de intervalo de chave criado por uma sobreposição dos bloqueios RangeI_N e X.

  • RangeX_S. Bloqueio de conversão de intervalo de chaves criado por uma sobreposição de bloqueios RangeI_N e RangeS-S.

  • RangeX_U. Bloqueio de conversão de intervalo de chave criado por uma sobreposição dos bloqueios RangeI_N e RangeS_U.

  • RangeX_X (Bloqueio de intervalo de chave exclusivo e de recurso exclusivo). Este é um bloqueio de conversão usado na atualização de uma chave em um intervalo.