Executando pesquisas com NOLOCK
No desenvolvimento de aplicações que requerem boa performance, existem diversos recursos que podem auxiliar o desenvolvedor a atingir sua meta de desempenho. Uma destas ferramentas é a cláusula NOLOCK.
Esta cláusula possui duas características que devem ser muito bem analisadas:
1) permite executar uma instrução SQL sem causar o bloqueio da tabela que está sendo lida;
2) permite ler dados não comitados.
A primeira característica é uma ótima vantagem, muito útil em grande parte dos cenários. Já a segunda característica pode se tornar um grande problema, a menos que o desenvolvedor saiba muito bem o que está fazendo.
Para maiores detalhes sobre prós e contras do NOLOCK, leia este artigo.
-- Instrução SQL normal: SELECT Codigo,Nome FROM Cliente ORDER BY Nome; -- Instrução com NoLock (no Microsoft SQL Server): SELECT Codigo,Nome FROM Cliente WITH(NOLOCK) ORDER BY Nome;
NOLOCK é definido por tabela, assim, se a instrução SQL faz referência a duas ou mais tabelas (como em uma operação JOIN, ou em instruções aninhadas) a cláusula precisa ser definida para cada uma das tabelas. Isso permite utilizar o NOLOCK apenas nas tabelas necessárias.
Para auxiliar o desenvolvimento de sistemas robustos usando a API de acesso a dados do Kankei, a partir do build 114 estamos disponibilizando no objeto ckoPesquisa uma propriedade que possibilita incluir a cláusula NOLOCK na instrução SQL executada pela pesquisa.
Por medidas de segurança, as opções de NOLOCK da pesquisa só podem ser utilizadas ao se executar a pesquisa programaticamente (não há opção na interface de criação de pesquisas do Kankei para se definir NOLOCK).
Segue exemplo:
// Cria a pesquisa da forma tradicional
var p = K.BD.NovaPesquisa('dimCliente');
p.Listar('cli-Nome', _
'cli-Endereco', _
'cli-Cidade\cid-Nome', _
'cli-Cidate\cid-Estado\est-Sigla')
// Inclui NOLOCK apenas para a tabela de cidades
p.ExecuçãoOpções.NoLockDimensions.Add('dimCidade');
// Executa a pesquisa da forma tradicional
var rs = p.Executar();
Você pode incluir WITH(NOLOCK) para múltiplas dimensões, bastando repetir a instrução Add():
// Usa NOLOCK nas tabelas de Cidades e de Estados
p.ExecuçãoOpções.NoLockDimensions.Add('dimCidade');
p.ExecuçãoOpções.NoLockDimensions.Add('dimEstado');
Se você quiser usar WITH(NOLOCK) em TODAS as dimensões referenciadas na pesquisa, utilize o caracter '*'. Apesar disso simplificar a codificação, o uso desta feature não é recomendado, pois o código pode passar por alguma manutenção onde a pesquisa passe a referenciar outras tabelas
// Usar NOLOCK em TODAS as tabelas da pesquisa
p.ExecuçãoOpções.NoLockDimensions.Add('*');
