Cause d'un processus d'être une victime
J'ai un processus avec une sélection qui prend beaucoup de temps pour terminer, sur l'ordre de 5 à 10 minutes.
Je ne suis actuellement pas en utilisant NOLOCK comme une allusion à la base de données MS SQL moteur.
Dans le même temps, nous avons un autre processus de faire de mises à jour et les insère dans la même base de données et même des tables.
Le premier processus a commencé, récemment, à la fin prématurément à un message
SQLEXCEPTION: Transaction a été bloquée sur les ressources par un autre processus et a été choisie comme victime.
Ce premier processus est en cours d'exécution à d'autres sites dans des conditions identiques, mais avec de petites bases de données et donc l'instruction select dans la question prend une période de temps plus courte (de l'ordre de 30 secondes). Dans ces autres sites, je n'ai pas l'impasse message dans ces autres sites. J'ai aussi fait de ne pas obtenir ce message sur le site qui est d'avoir le problème au départ, mais, je suppose, que la base de données a poussé, je crois que je dois avoir franchi un certain seuil. Voici mes questions:
- Pourraient le temps qu'il faut pour une opération à exécuter rendre le processus plus susceptibles d'être signalée comme une victime.
- Si je exécuter la sélection avec un indicateur NOLOCK, ça va enlever le problème?
- Je soupçonne qu'un champ datetime qui est vérifiée dans le cadre de la clause where dans l'instruction select est à l'origine de la lenteur de la recherche de temps. Puis-je créer un index sur ce champ? Est-il conseillé?
- Réponse partielle au point 1: Ne pas confondre un blocage avec un délai d'attente. Si vous souffriez d'un délai d'attente puis le temps de participer à la finition d'une transaction peut être responsable de l'autre abending. Aussi, il serait utile de savoir quelles sont les ressources qui vous sont interblocage sur (est-il d'un index ou d'une table?).
- SET DEADLOCK_PRIORITY autel de la BASE de données dbname SET MULTI_USER;
Vous devez vous connecter pour publier un commentaire.
Pas. Le SELECT est la victime, parce qu'il avait seulement lire les données, par conséquent, la transaction a un moindre coût associés avec elle est choisie comme victime:
Pas. Pour plusieurs raisons:
Probablement. La cause de l'impasse est presque très probable que ce soit un mal indexé de la base de données.10 minutes requêtes sont acceptables dans de telles conditions très spécifiques, que je suis certain à 100% dans votre cas est pas acceptable.
Avec confiance de 99%, je déclare que votre blocage est enfermé par une grande table de balayage en conflit avec les mises à jour. Commencez par capturer le graphique de blocage pour analyser la cause. Vous aurez très probablement d'optimiser le schéma de votre base de données. Avant de faire une quelconque modification, de lire cette rubrique La Conception D'Index et les sous-articles.
Ici est de savoir comment ce problème de blocage a eu lieu et comment il a été effectivement résolu. C'est une assez active de la base de données avec 130K transactions qui ont lieu tous les jours. Les index dans les tables de cette base de données ont été initialement mis en cluster. Le client nous a demandé de faire les index non cluster. Dès que nous l'avons fait, le blocage a commencé. Lorsque nous avons rétabli l'index en cluster, le blocage s'est arrêté.
Les réponses ici sont la peine d'essayer, mais vous devriez également consulter votre code. Avoir une lecture de Polyfun de réponse ici:
Comment se débarrasser d'impasse dans un Serveur SQL server 2005 et application en C#?
Il explique le problème de concurrence, et comment l'utilisation de "avec (updlock)" dans vos requêtes peuvent corriger votre situation de blocage selon vraiment sur exactement ce que votre code est en train de faire. Si votre code ne suivez ce modèle, il est probable qu'une meilleure correction à faire, avant de recourir à des lectures erronées, etc.