2010-10-04 6 views
11

La mia comprensione è che quando NOLOCK viene utilizzato nell'istruzione SELECT, potrebbe leggere anche righe non salvate/sporche. Ma volevo sfruttare l'hint NOLOCK sulla tabella in modo che la mia query SELECT fosse veloce.Istruzione SELECT - NOLOCK con SET TRANSACTION ISOLATION LEVEL READ COMMITTED

Ora, NOLOCK sulla tabella ma insieme a "SET TRANSACTION ISOLATION LEVEL READ COMMITTED" mi da vantaggio NOLOCK e query SELECT più veloce (a causa di NOLOCK) con sole righe impegnate (a causa di SET)?

risposta

17

sì un hint di tabella sostituisce l'impostazione livello di isolamento, così ancora sporcarsi legge

facile testare

primo run questo

create table bla(id int) 
insert bla values(1) 



begin tran 
select * from bla with (updlock, holdlock) 

fare attenzione a non commettere il tran !! aprire un'altra finestra ed eseguire questo

SET TRANSACTION ISOLATION LEVEL READ COMMITTED 

select * from bla -- with (nolock) 

non si ottiene nulla in cambio.

aprire un'altra finestra ed eseguire questo ora

SET TRANSACTION ISOLATION LEVEL READ COMMITTED 

select * from bla with (nolock) 

come si può vedere si otterrà indietro sulla riga

BTW, READ impegnata è il livello di isolamento predefinito, non c'è bisogno di impostarla

Dai uno sguardo allo Snapshot Isolation che non ti restituirà i dati sporchi ma non si bloccherà ancora