Um
SELECT no SQL Server colocará um bloqueio compartilhado em uma linha da tabela - e um segundo SELECT também exigiria um bloqueio compartilhado, e esses são compatíveis entre si. Então não - um
SELECT não pode bloquear outro SELECT . O que
WITH (NOLOCK) a dica de consulta é usada para poder ler dados que estão em processo de inserção (por outra conexão) e que ainda não foram confirmados. Sem essa dica de consulta, um
SELECT pode ser bloqueado lendo uma tabela por um INSERT em andamento (ou UPDATE ) que coloca uma declaração exclusiva trava em linhas (ou possivelmente em uma tabela inteira), até que a transação dessa operação tenha sido confirmada (ou revertida). Problema do
WITH (NOLOCK) dica é:você pode estar lendo linhas de dados que não serão inseridas, no final (se o INSERT transação é revertida) - então seu e.g. relatório pode mostrar dados que nunca foram realmente confirmados no banco de dados. Há outra dica de consulta que pode ser útil -
WITH (READPAST) . Isso instrui o SELECT comando para apenas pular todas as linhas que ele tenta ler e que estão bloqueadas exclusivamente. O SELECT não bloqueará e não lerá nenhum dado "sujo" não confirmado - mas pode pular algumas linhas, por exemplo não mostrar todas as suas linhas na tabela.