web-dev-qa-db-fra.com

Quelle est (sont) la différence entre NOLOCK et UNCOMMITTED

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)
36
Ardalan Shahgholi

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

39
Pரதீப்

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.

16
Prabu

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
14
Code Different

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

7
CPMunich

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

1
M Prabhu