Uma consulta de seleção simples adquire bloqueios?

13

Eu sou muito novo no SQL Server e gostaria de entender se a seguinte selectdeclaração muito simples levaria algum bloqueio.

Select * from Student;

Por favor, considere o caso em que a instrução não seria executada dentro de um begin tranbloco.

Novo desenvolvedor
fonte
1
Essa é uma pergunta muito mais complicada do que você imagina. A resposta depende de várias coisas (qual é o nível de isolamento da transação da sessão? O isolamento de instantâneo confirmado por leitura está ativado? O índice digitalizado possui opções definidas para impedir bloqueios de linha ou de página?) E pode até mudar durante a execução da instrução (quantas linhas estão na tabela? a tabela está particionada?). Aqui está um bom ponto para começar a ler.
precisa

Respostas:

5

Sim, ele usa um bloqueio compartilhado nas linhas que lê por padrão (ele também usa um bloqueio compartilhado por intenção em todas as páginas do índice clusterizado que ele lerá); isso é feito para impedir leituras sujas. No entanto, existem maneiras de contornar isso (o SQL Server tem a dica nolock). Se a instrução não estiver em um BEGIN TRAN, o bloqueio será liberado após a execução da instrução SELECT.

Mais informações podem ser encontradas aqui:

http://msdn.microsoft.com/en-us/library/ms184286(v=sql.105).aspx http://www.sqlteam.com/article/introduction-to-locking-in-sql-server

Enrugamento
fonte
Além disso, você também pode definir o nível de isolamento da transação como não confirmado.
Zane
1
Portanto, se o SELECT lê dez linhas, os dez bloqueios compartilhados são mantidos até todas as dez linhas terem sido lidas ou são adquiridos e liberados por linha?
11118 Ian Ian Burburton
25

Gostaria de entender se a seguinte instrução de seleção muito simples levaria algum bloqueio

É um equívoco comum que uma SELECTconsulta em execução no READ COMMITTEDnível de isolamento de transação padrão sempre use bloqueios compartilhados para impedir leituras sujas.

O SQL Server pode evitar a execução de bloqueios compartilhados no nível da linha quando não houver perigo de ler dados não confirmados sem eles (embora os bloqueios de intenção compartilhada (IS) de nível superior ainda sejam utilizados).

Mesmo se os bloqueios de linha compartilhados forem executados (talvez porque outra transação simultânea tenha modificado a página em que a linha está), eles poderão ser liberados muito antes da SELECTconclusão da instrução.

Na maioria dos casos, a linha é 'desbloqueada' imediatamente antes do servidor processar a próxima linha. Há circunstâncias em que os bloqueios compartilhados obtidos no nível de isolamento padrão são mantidos no final da instrução atual, mas não no final da transação .

Substituir o nível de isolamento atual pela NOLOCKdica da tabela é quase sempre uma má idéia .

O bloqueio é um detalhe de implementação. O SQL Server bloqueia quando necessário para garantir que atenda às garantias semânticas fornecidas pelo nível de isolamento atual . Certamente, há momentos em que é útil saber um pouco sobre por que os bloqueios são executados, mas tentar prevê-los é muitas vezes contraproducente.

O SQL Server fornece uma ampla variedade de níveis de isolamento; escolha aquele que forneça as garantias e comportamentos de que seus consumidores de dados precisam.

Paul White 9
fonte