Ask Learn
Preview
Please sign in to use this experience.
Sign inThis browser is no longer supported.
Upgrade to Microsoft Edge to take advantage of the latest features, security updates, and technical support.
Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Links relacionados
O comando NOLOCK avisa o processador do SQL Server para evitar a utilização de bloqueios (LOCK) durante a leitura de dados. Porém, o SQL Server continua utilizando os bloqueios durante operações de modificação de dados e não há como mudar esse comportamento. A utilização do NOLOCK é, portanto, inválida para as tabelas que terão registros afetados por INSERT, DELETE e UPDATE.
INSERT tbUsuarios WITH (NOLOCK) (nome) VALUES ('A')
DELETE tbUsuarios WITH (NOLOCK) WHERE id = 1
UPDATE tbUsuarios WITH (NOLOCK) SET nome = 'B' WHERE id = 1
Esses comandos resultam no erro:
Msg 1065, Level 15, State 1, Line 15
The NOLOCK and READUNCOMMITTED lock hints are not allowed for target tables of INSERT, UPDATE, DELETE or MERGE statements.
A restrição do NOLOCK se aplica somente à tabela que receberá os novos registros, sendo ainda possível utilizar NOLOCK para as tabelas que fornecem os registros. Exemplo:
INSERT tbHistorico (Nome)
SELECT Nome FROM tbUsuarios WITH (NOLOCK)
Nesse caso, os dados serão lidos a partir da tabela tbUsuarios e gravadas na tabela tbHistorico. A restrição do NOLOCK existe para a tabela tbHistorico, mas não impede seu uso na tabela tbUsuarios.
A sintaxe do comando DELETE permite utilizar o NOLOCK para as tabelas que não terão registros apagados. Por exemplo, em uma operação de JOIN entre tabelas, aquelas usadas para leitura aceitam o NOLOCK.
-- FUNCIONA
DELETE tbHistorico
FROM tbUsuarios u WITH (NOLOCK) WHERE tbHistorico.id=u.id
Nesse caso, a restrição se aplica somente a tbHistorico. A tabela tbUsuarios é utilizada somente para leitura e permite a utilização de NOLOCK.
A mesma regra se aplica ao UPDATE. Em uma operação de JOIN, as tabelas usadas para leitura aceitam o NOLOCK ea restrição se aplica somente a tabela que será modificada.
-- FUNCIONA
UPDATE tbHistorico SET Nome = u.Nome
FROM tbUsuarios u WITH (NOLOCK) WHERE tbHistorico.id=u.id
Please sign in to use this experience.
Sign in