UPDATE WITH (NOLOCK): Como funciona?
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.
INSERT WITH (NOLOCK)
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.
DELETE WITH (NOLOCK)
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.
UPDATE WITH (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