Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Entendendo o SQL Server LOCKS em consultas SELECT


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.