2010-10-04 4 views
11

Je crois comprendre que lorsque NOLOCK est utilisé dans l'instruction SELECT, il peut également lire les lignes non validées/encrassées. Mais je voulais profiter de l'indice NOLOCK sur la table pour que ma requête SELECT puisse s'exécuter rapidement. Maintenant, est-ce que NOLOCK sur la table mais avec "SET TRANSACTION ISOLATION LEVEL READ COMMITTED" me donne un avantage NOLOCK et une requête SELECT plus rapide (à cause de NOLOCK) avec seulement des lignes validées (à cause de SET)?Instruction SELECT - NOLOCK avec SET TRANSACTION ISOLATION LEVEL READ COMMITTED

Répondre

17

oui un soupçon de table remplace le paramètre de niveau d'isolation, de sorte que vous obtiendrez toujours sale lit

facile à tester

première manche ce

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



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

assurez-vous commettez pas la tran !! ouvrir une autre fenêtre et exécutez ce

SET TRANSACTION ISOLATION LEVEL READ COMMITTED 

select * from bla -- with (nolock) 

vous ne recevez rien en retour.

ouvrir une autre fenêtre et exécuter ce maintenant

SET TRANSACTION ISOLATION LEVEL READ COMMITTED 

select * from bla with (nolock) 

que vous pouvez voir vous récupérerez la ligne

BTW, READ COMMITTED est le niveau d'isolation par défaut, pas besoin de le mettre

Jetez un oeil à Snapshot Isolation qui ne vous rendra pas les données sales mais ne verrouillera toujours pas

Questions connexes