web-dev-qa-db-fra.com

syntaxe pour nolock en sql

J'ai vu des instructions SQL utilisant nolock et avec (nolock) E.g - 

select * from table1 nolock where column1 > 10

ET

select * from table1 with(nolock) where column1 > 10

Lequel des énoncés ci-dessus est correct et pourquoi? 

18
seenasan

La première déclaration ne verrouille rien, alors que la seconde le fait. Quand j’ai testé cela tout à l’heure sur SQL Server 2005, dans

select * from table1 nolock where column1 > 10 --INCORRECT

"nolock" est devenu l'alias, dans cette requête, de table1.

select * from table1 with(nolock) where column1 > 10

exécute la fonctionnalité nolock souhaitée. Sceptique? Dans une fenêtre séparée, exécutez

BEGIN TRANSACTION
UPDATE tabl1
 set SomeColumn = 'x' + SomeColumn

pour verrouiller la table, puis essayez chaque instruction de verrouillage dans sa propre fenêtre. Le premier se bloque en attendant que le verrou soit libéré, et le second s'exécute immédiatement (et affiche les "données modifiées"). N'oubliez pas d'émettre

ROLLBACK

quand tu as fini.

29
Philip Kelley

La liste des fonctionnalités obsolètes se trouve sous Fonctions obsolètes du moteur de base de données dans SQL Server 2008 :

  • Spécifier NOLOCK ou READUNCOMMITTED dans la clause FROM d'un UPDATE ou SUPPRIMER déclaration. 
  • Tableau de spécification des astuces sans utiliser le mot clé WITH. 
  • Indicateur de table HOLDLOCK sans parenthèse
  • Utilisation d'un espace comme séparateur entre les indicateurs de table.
  • L’application indirecte d’indices de table à l’appel d’une fonction de table-instruction à plusieurs instructions (TVF) via une vue.

Elles font toutes partie de la liste des fonctionnalités qui seront supprimées parfois après la prochaine version de SQL, ce qui signifie qu'elles ne seront probablement prises en charge dans la version enxt que sous un niveau de compatibilité de base de données inférieur.

Cela étant dit mes 2c sur la question sont en tant que tels:

  • from table nolock et from table with(nolock) sont faux. Si vous avez besoin de lectures modifiées, vous devez utiliser transaction isolation levels: set transaction isolation level read uncommitted. De cette façon, le niveau d’utilisation utilisé est explicitement indiqué et contrôlé à partir d’un «bouton», au lieu d’être étalé dans la source et soumis à toutes les bizarreries de conseils de table (application indirecte par le biais de vues et de TVF, etc.).
  • Les lectures sales sont une abonimation. Ce qui est nécessaire, dans 99,99% des cas, est une réduction des conflits, et non pas la lecture de données non validées. La contention est réduite en écrivant des requêtes appropriées sur un schéma bien conçu et, si nécessaire, en déployant l'isolation de cliché. La meilleure solution, qui résout le problème, sauve presque toujours quelques cas extrêmes, est de permettre la lecture d'instantanés validés dans la base de données et laisser le moteur fonctionner de manière magique: 

    ALTER DATABASE MyDatabase SET ALLOW_SNAPSHOT_ISOLATION ON
    ALTER DATABASE MyDatabase SET READ_COMMITTED_SNAPSHOT ON

Ensuite, supprimez TOUS les conseils des sélections.

18
Remus Rusanu

Ils sont tous les deux techniquement corrects, cependant ne pas utiliser le mot clé WITH est obsolète à partir de SQL 2005, familiarisez-vous donc avec l’utilisation du mot clé WITH - réponse courte, utilisez le mot clé WITH.

6
boydc7

Utilisez "WITH (NOLOCK)".

5
Rob Garrison

Les deux sont syntaxiquement corrects. 

NOLOCK deviendra l'alias de la table1.

WITH (NOLOCK) est souvent utilisé comme un moyen magique d’accélérer les lectures de bases de données, mais j’essaie d’éviter de l’utiliser autant que possible.

L'ensemble de résultats peut contenir des lignes qui n'ont pas encore été validées, qui sont souvent ultérieurement restaurées.

Une erreur ou un ensemble de résultats peut être vide, être des lignes manquantes ou afficher la même ligne plusieurs fois.

En effet, d’autres transactions déplacent des données en même temps que vous les lisez.

READ COMMITTED ajoute un problème supplémentaire dans lequel les données sont corrompues dans une seule colonne lorsque plusieurs utilisateurs changent simultanément la même cellule.

Il y a aussi d'autres effets secondaires, qui ont pour conséquence de sacrifier l'augmentation de vitesse que vous espériez gagner en premier lieu.

Maintenant, vous savez, ne l'utilisez plus jamais.

0
Knickerless-Noggins