J'utilise SQL Server 2012.
J'écris deux requêtes mais quelle est la différence entre NOLOCK
et UnCommitted
?
SELECT lastname, firstname
FROM HR.Employees with (READUNCOMMITTED)
SELECT lastname, firstname
FROM HR.Employees with (NoLock)
NOLOCK: Est équivalent à READUNCOMMITTED
(source: MSDN )
NOLOCK
ou READUNCOMMITTED
Spécifie que les lectures sales sont autorisées. Aucun verrou partagé n'est émis pour empêcher d'autres transactions de modifier les données lues par la transaction en cours, et des verrous exclusifs définis par d'autres transactions n'empêchent pas la transaction en cours de lire les données verrouillées. Autoriser les lectures incorrectes peut entraîner une concurrence accrue, mais au prix de la lecture des modifications de données qui sont ensuite annulées par d'autres transactions
READUNCOMMITTED
et NOLOCK
les astuces ne s'appliquent qu'aux verrous de données. Toutes les requêtes, y compris celles with READUNCOMMITTED and NOLOCK hints
, acquiert les verrous Sch-S (stabilité du schéma) pendant la compilation et l'exécution. Pour cette raison, les requêtes sont bloquées lorsqu'une transaction simultanée contient un verrou Sch-M (modification de schéma) sur la table
Sous le capot, ils effectuent la même action.
Le read-uncommitted
le niveau d'isolement est le niveau d'isolement le moins restrictif dans SQL Server, ce qui le rend également populaire pour les développeurs qui cherchent à réduire le blocage.
L'indice de table nolock
en arrière-plan exécute exactement la même action que l'exécution sous le niveau d'isolement non engagé.
Leseule différence entre les deux est que le read-uncommitted
le niveau d'isolement détermine le mécanisme de verrouillage de la connexion entière et l'indicateur de table nolock
détermine le mécanisme de verrouillage de la table à laquelle vous donnez l'indication.
Aucune différence en termes de fonctions, comme d'autres l'ont mentionné.
La seule différence est que vous pouvez appliquer WITH(NOLOCK)
de manière sélective, sur certaines tables mais pas sur d'autres. READ UNCOMMITTED
Applique NOLOCK
à toutes les tables d'une session.
Si tu fais ça:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT *
FROM Table1 T1
INNER JOIN Table2 T2 ON T1.ID = T2.id
Il est fonctionnellement équivalent à:
SELECT *
FROM Table1 T1 WITH(NOLOCK)
INNER JOIN Table2 T2 WITH(NOLOCK) ON T1.ID = T2.ID
Mais vous pouvez également appliquer WITH(NOLOCK)
sélectivement:
SELECT *
FROM Table1 T1 WITH(TABLOCK)
INNER JOIN Table2 WITH(NOLOCK) ON T1.ID = T2.ID
Il n'y a aucune différence au niveau de l'instruction.
Vous pouvez définir READUNCOMMITED au niveau de la session et ici vous devez écrire SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
Pour NOLOCK, nous devons mettre cet indice au niveau de la table, il est donc nécessaire de le mettre pour chaque niveau de tables utilisé dans la transaction de mise à jour. Il est donc très long et long de le mettre partout où les tables se réfèrent à la requête. Pour READ UNCOMMITTED, nous n'avons pas besoin de le mettre à chaque niveau des tables, il suffit de le mettre au niveau de la session ou au niveau de la requête et peut être écrit en haut de la requête ou de la procédure stockée. Regardons une petite démo pour la développer. Première vérification ici du niveau d'isolement par défaut de la base de données
CREATE TABLE SAMPLETABLE
(
Col1 INT ,
Col2 VARCHAR(100)
)
INSERT INTO SAMPLETABLE(Col1,Col2)
SELECT 1,'Col1'
Union all
SELECT 2,'Col1'
BEGIN TRANSACTION
Update SAMPLETABLE Set Col2 = 'Value changed' Where col1 =1
Select * from SAMPLETABLE with (nolock)
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
Select * from SAMPLETABLE
La sortie est 1, Col1 pour les deux requêtes