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.