Nous exécutons SQL Server 2000 et nous obtenons quelques-unes de ces erreurs chaque nuit.
Could not continue scan with NOLOCK due to data movement
La requête qui renvoie cette erreur est une grande requête complexe qui joint plus d'une douzaine de tables. Nos données sous-jacentes peuvent être mises à jour fréquemment.
La «meilleure pratique» culturelle est que, dans le passé, l'introduction d' NOLOCK
indices augmentait les performances et améliorait la concurrence. Cette requête n'a pas besoin d'être précise à 100%, c'est-à-dire que nous tolérerons les lectures sales, etc. Cependant, nous avons du mal à comprendre pourquoi la base de données génère cette erreur, même si nous avons toutes ces astuces de verrouillage.
Quelqu'un peut-il éclairer cela - soyez doux, je suis en fait un programmeur, pas un DBA :)
PS: nous avons appliqué le correctif mentionné ci-dessous précédemment: http://support.microsoft.com/kb/815008
la source
Réponses:
Il s'agit d'un problème raisonnablement bien connu avec SQL Server 2000 - essentiellement, ce qui se passe est si une ligne est supprimée par le processus A pendant que le processus B effectue une analyse (soit à
READ UNCOMMITTED
ouWITH (NOLOCK)
), alors le processus B va "hein ce qui est arrivé à ces données "quand il essaie de le lire. Plus précisément, la ligne doit être supprimée après que le processus B a lu l'index, mais avant de tenter de lire la ligne de données.Craig Freedman donne une bonne écriture ici
Heureusement, le correctif est relativement simple: http://support.microsoft.com/kb/815008
Si cela ne fonctionne pas, vous avez l'option légèrement plus douloureuse de supprimer tous vos
WITH (NOLOCK)
conseils et de définir votre niveau d'isolement des transactions à quelque chose au-dessusREAD UNCOMMITTED
.la source