Sou muito novo no SQL Server e gostaria de entender se a select
instrução a seguir, muito simples, teria algum bloqueio.
Select * from Student;
Por favor, considere o caso em que a instrução não estaria sendo executada dentro de um begin tran
bloco.
É um equívoco comum que uma consulta executada no nível de isolamento de transação
SELECT
padrão sempre terá bloqueios compartilhados para evitar leituras sujas.READ COMMITTED
O SQL Server pode evitar bloqueios compartilhados em nível de linha quando não há perigo de ler dados não confirmados sem eles (embora os bloqueios Intent-Shared (IS) de nível superior ainda sejam usados).
Mesmo que os bloqueios de linha compartilhados sejam usados (talvez porque outra transação simultânea tenha modificado a página em que a linha está), eles podem ser liberados muito antes da
SELECT
conclusão da instrução.Na maioria dos casos, a linha é 'desbloqueada' antes que o servidor processe a próxima linha. Há circunstâncias em que os bloqueios compartilhados no nível de isolamento padrão são mantidos até o final da instrução atual, mas não até o final da transação .
Substituir o nível de isolamento atual pela
NOLOCK
dica de tabela é quase sempre uma má idéia .O bloqueio é um detalhe de implementação. O SQL Server faz bloqueios 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 feitos, mas tentar prevê-los muitas vezes é contraproducente.
O SQL Server fornece uma ampla variedade de níveis de isolamento; escolha aquele que oferece as garantias e os comportamentos de que seus consumidores de dados precisam.
Sim, ele faz um bloqueio compartilhado nas linhas que lê por padrão (também leva um bloqueio Intent Shared em todas as páginas do índice clusterizado que ele lerá), isso é feito para evitar 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