web-dev-qa-db-fra.com

Comment reproduire "Impossible de continuer à numériser avec Nolock en raison du mouvement des données"

J'obtiens de temps en temps "Impossible de continuer à numériser avec NOLOCK en raison du mouvement de données" avec quelques tâches importants, qui ont WITH (NOLOCK) sur les requêtes SELECT.

Je comprends que cela a quelque chose à voir avec la tentative de sélection de données lorsqu'il y a eu une scission de page qui a provoqué que les données ne soient plus si elles étaient censées être - je suppose que c'est ce qui se passe dans mon environnement.

Comment puis-je reproduire cela?

J'essaie de faire une solution de contournement à court terme pour attraper l'erreur et réessayer lorsque cela se produit, mais je ne peux pas le tester si je ne peux pas le reproduire. Y a-t-il un moyen raisonnablement fiable de causer cela?

Quand cela se produit, exécutant la requête à nouveau résulte du succès - je n'ai donc pas vraiment de préoccupations concernant les données réelles ou la base de données corrompu de manière permanente. Certaines des tables de la requête (ainsi que leurs indices) sont abandonnées, recréées et repeuplées souvent, alors je suppose que c'est quelque chose qui est lié à cela.

Supprimer NOLOCK est ma question à long terme à traiter. La raison NOLOCK a été mise là-bas en premier lieu, c'est que les requêtes sont si mauvaises qu'ils étaient une manquement avec des transactions quotidiennes, alors NOLOCK était une aide à la bande pour arrêter les blocages (qui a fonctionné). J'ai donc besoin d'une aide au bandage sur un groupe d'aide jusqu'à ce que nous puissions faire une solution permanente.

Si je pouvais le reproduire avec un monde Hello, je planifierais probablement gifler le groupe de l'aide au travail en moins d'une heure. Je ne peux pas faire une recherche de recherche-and-remplacer NOLOCK, car je commencerais à faire de l'apport de l'application, qui pire pour moi qu'un travail défaillant occasionnel.

L'utilisation de l'isolement d'instantané de lecture est une bonne possibilité - je vais devoir travailler avec notre équipe de base de données pour obtenir plus de détails à ce sujet. Une partie de notre problème est que nous n'avons pas d'expert SQL Server pour traiter ce genre de chose, et je ne comprends pas les niveaux d'isolement assez pour faire ce changement en ce moment.

10
wookie23

Étant donné qu'un "aide à bande" potentiel sur les problèmes Nolock est de cesser d'utiliser Nolock et de commencer à utiliser Read_Committed_snapshot Isolation, je souhaite vous diriger vers le blog Post à http://www.brentozar.com par Kendra Petit: Mise en œuvre de l'instantané ou lecture de l'isolement d'instantané engagé dans SQL Server: un guide .

Kendra fournit une juste quantité de détails sur les avantages et les risques avec l'utilisation du niveau d'isolation READ_COMMITTED_SNAPSHOT.

  1. Ce niveau d'isolement devient le niveau d'isolement par défaut pour le code de la base de données.
  2. Vous devez avoir un seul utilisateur dans la base de données afin de modifier le niveau d'isolation READ_COMMITED_SNAPSHOT.
  3. Même si vous utilisez read_committed_snapshot islamment Vous devez toujours retirer les indications NOLOCK car ils remplacent la valeur par défaut.
  4. Certains de votre code peuvent bien avoir des problèmes qui nécessitent du durcissement.

Il y a quelques années, nous avons mis en place une isolation Lecture_Committed_SnaSshot sur une base de données qui était sévèrement souffrant de blocage . Mais une fois que nous avons changé le niveau d'isolement, nous avons commencé à obtenir des blocages dans quelques domaines critiques.

Pourquoi est-ce arrivé? Étant donné que le niveau d'isolement précédent a provoqué un blocage intensif, le code pourrait "ne jamais" atteindre le point de manœuvre. Cependant, avec isolement de lecture_commadie_snapshot, les requêtes pourraient continuer à aller de l'avant. Cependant, un pourcentage des transactions en attente sans plus d'attente a commencé une impasse.

Heureusement, notre cas a été résolu rapidement en déterminant les points d'impasse et en ajustant les index sur quelques tables pour avoir une commande de colonne plus rationnelle. Cela a considérablement réduit nos problèmes de verrouillage.

8
RLF