Dicas de bloqueio
Dicas de bloqueio podem ser especificadas para referências de tabela individuais nas instruções SELECT, INSERT, UPDATE e DELETE. As dicas especificam o tipo de bloqueio ou controle de versão de linha da instância que o Mecanismo de banco de dados do SQL Server usa para dados de tabela. Dicas de bloqueio de tabelas podem ser usadas quando é necessário um controle mais refinado dos tipos de bloqueios adquiridos em um objeto. Essas dicas de bloqueio substituem o nível de isolamento da transação atual na sessão.
Para obter mais informações sobre as dicas de bloqueio específicas e seus comportamentos, consulte Dicas de tabela (Transact-SQL).
Observação |
---|
O otimizador de consulta Mecanismo de Banco de Dados quase sempre escolhe o nível de bloqueio correto. É recomendável que as dicas de bloqueio no nível de tabela sejam usadas para alterar o comportamento de bloqueio padrão apenas quando necessário. Não permitir um nível de bloqueio pode afetar adversamente a simultaneidade. |
O Mecanismo de Banco de Dados talvez tenha que adquirir bloqueios ao ler metadados, mesmo quando está processando uma seleção com uma dica de bloqueio, que impede solicitações para bloqueios de compartilhamento durante a leitura de dados. Por exemplo, SELECT usando a dica NOLOCK não adquire bloqueios de compartilhamento ao ler dados, mas pode solicitar bloqueios ao ler uma exibição de catálogo do sistema. Isso significa que é possível uma instrução SELECT usando NOLOCK ser bloqueada.
Como é mostrado no exemplo a seguir, se o nível de isolamento da transação for configurado para SERIALIZABLE, e a dica de bloqueio em nível de tabela NOLOCK for usada com a instrução SELECT, bloqueios de intervalo de chaves usados para manter transações serializáveis não são aceitos.
USE AdventureWorks2008R2;
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
GO
BEGIN TRANSACTION;
GO
SELECT Title
FROM HumanResources.Employee WITH (NOLOCK);
GO
-- Get information about the locks held by
-- the transaction.
SELECT
resource_type,
resource_subtype,
request_mode
FROM sys.dm_tran_locks
WHERE request_session_id = @@spid;
-- End the transaction.
ROLLBACK;
GO
O único bloqueio aceito que referencia HumanResources.Employee é um bloqueio de estabilidade (Sch-S) de esquema. Nesse caso, a seriabilidade não é mais garantida.
No SQL Server 2008, a opção de LOCK_ESCALATION de ALTER TABLE pode não favorecer bloqueios de tabela e ativa bloqueios HOBT em tabelas particionadas. Essa opção não é uma dica de bloqueio, mas pode ser usada para reduzir o escalonamento do bloqueio. Para obter mais informações, consulte ALTER TABLE (Transact-SQL).