Quando utilizar NOLOCK e READPAST no SqlServer.

Autor : Antonio Carlos Ferreira de Azevedo
Postado em : 25/09/2019


Ambas as instruções evitam o bloqueio de registros durante uma transação no SqlServer, porem trazendo dados incorretos, suas maneiras de fazer isso são muito diferentes, vamos entender agora seu funcionamento e diferenças.

Exemplo de uma transação

USE TesteDB
GO

BEGIN TRANSACTION T1
 
DELETE FROM TabelaTeste WHERE ID=1

UPDATE TabelaTeste SET valor= 'D'  WHERE valor='C'

INSERT INTO TabelaTeste  (ID, valor)  VALUES (4,'E') , (5, 'F')
 
GO

WAITFOR DELAY '00:00:05'

-- Transação pode ser finalizada com o comando COMMIT para gravar os dados ou ROLLBACK onde descartamos as alterações 

ROLLBACK


NOLOCK

Durante uma transação este comando traz os dados alterados antes mesmo de serem gravados (COMMIT) no banco, o principal problema esta no fato de lermos um dado alterado e não gravado, caso o usuário reverta a operação com um ROLLBACK, os dados exibidos jamais existiram.

Exemplo

SELECT * FROM TabelaTeste WITH (NOLOCK)


READPAST

Já neste caso, os dados que estão sendo alterado não retornam na consulta, também temos um efeito desagradável, pois, o usuário da vai ver alguns dados, estes dados estarão disponíveis somente depois da operação de COMMIT já alterados ou depois de ROLLBACK em sua forma original.

Exemplo

SELECT * FROM TabelaTeste WITH (READPAST)




Comentários