por Celso Arruda - MCDBA - Analista de Sistemas - Jornalista - MBA
Entendendo o Comando SQL WITH (NOLOCK)
O comando WITH (NOLOCK)
é uma diretiva usada em consultas SQL no Microsoft SQL Server para indicar que a leitura dos dados deve ser feita sem bloquear os registros e sem respeitar os bloqueios existentes. Ele é frequentemente utilizado quando se busca melhorar a performance de leitura em ambientes com alta concorrência, mas seu uso exige cuidados. Vamos entender como funciona, vantagens e riscos.
O que é o WITH (NOLOCK)
?
Quando você executa uma consulta SQL, como:
SELECT * FROM Clientes;
O SQL Server aplica um bloqueio de leitura (shared lock) nas linhas acessadas, garantindo que nenhum outro processo modifique os dados enquanto a leitura estiver ocorrendo. Com isso, evita-se a leitura de dados inconsistentes.
Ao usar:
SELECT * FROM Clientes WITH (NOLOCK);
Você está dizendo ao SQL Server: "Leia os dados, mesmo que eles estejam sendo modificados por outras transações". Isso faz com que a consulta não espere por locks (bloqueios) e também não aplique locks de leitura.
Vantagens do WITH (NOLOCK)
-
Melhora na performance:
- Consultas mais rápidas, especialmente em grandes volumes de dados.
- Evita "blocking" (esperas por desbloqueios) em ambientes concorridos.
-
Maior fluidez em sistemas OLAP ou relatórios:
- Útil em relatórios que não exigem 100% de precisão em tempo real.
Desvantagens e riscos do WITH (NOLOCK)
-
Dirty Reads (leituras sujas):
- Pode retornar dados que estão sendo modificados e ainda não foram confirmados com
COMMIT
. - Isso inclui dados que podem ser revertidos com um
ROLLBACK
.
- Pode retornar dados que estão sendo modificados e ainda não foram confirmados com
-
Phantom Reads e dados inconsistentes:
- Linhas podem "aparecer" ou "desaparecer" durante a leitura.
- Colunas de uma mesma linha podem vir de momentos diferentes da transação.
-
Não é seguro para operações críticas:
- Relatórios financeiros, sistemas bancários ou registros contábeis não devem utilizar
NOLOCK
.
- Relatórios financeiros, sistemas bancários ou registros contábeis não devem utilizar
Alternativas seguras ao NOLOCK
-
READ COMMITTED SNAPSHOT (RCSI):
- Um nível de isolamento que usa versionamento de linha, evitando bloqueios e leituras sujas.
-
Níveis de isolamento controlados por transações:
READ COMMITTED
,REPEATABLE READ
,SNAPSHOT
,SERIALIZABLE
, entre outros.
O uso do WITH (NOLOCK)
deve ser avaliado com cautela. Ele é útil quando a prioridade é a velocidade e pequenas inconsistências são aceitáveis, como em dashboards de monitoramento ou análises de grandes volumes de dados. Contudo, para aplicações críticas, onde precisão e integridade dos dados são essenciais, deve-se evitar seu uso e buscar soluções mais robustas com controle de transações e versionamento.
Nenhum comentário:
Postar um comentário