uso do lock ...
Iniciando os testes....
Passos
01 - Você deve utilizar dois Query Analyzer. (OBS devem ser duas janelas do
Query Analyzer e não duas novas querys) Conecte no servidor AresDesenv
banco de dados Desenv
02 - Query Analyzer 1 rode o seguinte código
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
select * from Table3 with (XLOCK)
OBS: note que o código simplesmente vai rodar e pronto
03 - No Query Analyzer 2 rode o seguinte código
exec sp_lock XX
Onde XX é o spid do Query Analyzer 1
Observe que o SQL vai gerar um lock do tipo Mode = X, esse tipo de
lock não é compartilhado.
04 - Agora faça o seguinte no Query Analyzer 2 rode o seguinte código
select * from desenv..Table3
O SQL não vai conseguir completar a instrução uma vez que estamos
com uma transação aberta e um lock não compartilhado em cima da tabela de
trabalho (ele vai resolver isso quanto tiver um commit ou um rollback),
portanto aborte (cancele) esse teste
05 - Agora rode o seguinte código no Analyzer 2
select * from desenv..Table3 with (nolock)
Isso o SQL vai ser capaz de executar pois você acabou de abrir mão
do controle transacional
Portanto é por isso que falamos que o nolock pode trazer sujeira, suponha
que estivéssemos fazendo um comando de insert ao invés de um select no Query
Analyzer 1 com o uso do nolock os dados insertados retornariam no select (no
Query Analyzer 2) com nolock mesmo que a transação não tenha sido comitada.
Portanto esse são os ganhos e as perdas com o uso do nolock.