Il existe de nombreuses raisons pour lesquelles les applications peuvent être lentes à répondre, mais si les utilisateurs se plaignent des performances, vous pouvez être confronté à un blocage SQL Server. Heureusement, il existe des moyens d'identifier et de corriger le blocage de SQL Server, et même de l'empêcher d'affecter négativement les performances des applications.
Le blocage de SQL Server est essentiellement une impasse entre deux processus qui se disputent l'accès exclusif à la même ressource. Étant donné qu'un seul processus peut utiliser une ressource à la fois, les performances ralentissent jusqu'à ce que le blocage soit résolu.
Il existe deux types de blocages SQL Server à surveiller :les verrous de conversion et les verrous de cycle.
Les interblocages de verrouillage de conversion se produisent lorsqu'un thread essaie de convertir un verrou d'un type exclusif en un autre type exclusif mais n'y parvient pas car un autre thread détient déjà un verrou partagé sur la ressource que le premier thread essaie de convertir.
Dans SQL Server, il existe trois types de verrous de conversion :
- Partagé avec intention exclusive (SIX) :ce verrou se produit lorsqu'une transaction qui détient un verrou partagé possède également un verrou exclusif sur certaines pages ou lignes.
- Mise à jour partagée avec intention (SIU) :ce verrou se produit lorsqu'une transaction qui détient un verrou partagé a également certaines pages ou lignes verrouillées avec un verrou de mise à jour.
- Mise à jour avec intention exclusive (UIX) :ce verrou se produit lorsqu'une transaction qui détient un verrou de mise à jour possède également un verrou exclusif sur certaines pages ou lignes.
Les verrous cycliques sont des interblocages SQL Server provoqués par deux processus en lice pour un verrou exclusif sur une ressource qui est verrouillée par l'autre processus.
Par exemple, le processus 1 maintient un verrou sur la ressource 1 en attendant que le processus 2 libère son verrou sur la ressource 2. Si le processus 2 maintient un verrou sur la ressource 2 en attendant que le processus 1 libère la ressource 1, nous avons nous-mêmes une impasse de verrouillage de cycle.
Comment diagnostiquer le blocage de SQL Server
Le blocage de SQL Server n'est qu'une des dizaines de raisons possibles pour lesquelles votre application peut avoir des problèmes de performances. Si les requêtes qui s'exécutent normalement rapidement ralentissent soudainement, il est possible que vous ayez un blocage. Mais il est également possible que quelque chose d'autre se passe.
Ainsi, en plus de constater une réduction de la vitesse des requêtes, comment déterminer avec certitude si l'interblocage est à l'origine des problèmes de performances de votre base de données ?
Le moyen le plus simple et le plus définitif d'identifier un blocage est la présence d'un message d'erreur 1205 :
La transaction (ID de processus %d) a été bloquée sur les ressources %.*ls avec un autre processus et a été choisie comme victime du blocage. Réexécutez la transaction.
Le message d'erreur 1205 vous indique littéralement qu'il y a un blocage et comment le résoudre. Cependant, comme le souligne Jeremiah Peschka, si vous n'avez pas corrigé la cause de l'impasse, la réexécution de la transaction échouera probablement.
Une autre option pour rechercher des blocages consiste à extraire un graphique de blocage SQL Server des événements étendus. L'extraction du blocage via les événements étendus vous permet d'examiner le code XML du blocage, qui fournit plus d'informations que la représentation graphique d'un graphique de blocage.
Le XML de blocage est organisé par la liste des victimes, la liste des processus et la liste des ressources. Chaque section donne des descriptions détaillées des victimes, des processus et des ressources impliqués dans l'impasse, ce qui facilite le dépannage et la résolution du problème.
Comment résoudre le blocage de SQL Server
Le seul moyen de résoudre un blocage SQL Server consiste à mettre fin à l'un des processus et à libérer la ressource verrouillée afin que le processus puisse se terminer. Cela se produit automatiquement lorsque SQL Server détecte un blocage et tue l'un des processus concurrents (c'est-à-dire la victime).
SQL Server choisit normalement la connexion à supprimer au hasard, mais il est possible de définir des priorités de blocage pour déterminer quelle connexion est supprimée lors d'un blocage. Lorsque deux connexions ont des paramètres de priorité différents, SQL Server tuera la transaction avec la priorité la plus basse.
Comment empêcher le blocage de SQL Server
L'impasse SQL Server est une réalité de la vie lorsque vous gérez une base de données occupée. Cependant, les administrateurs de base de données peuvent aider à réduire l'occurrence des interblocages et à minimiser leur impact sur les performances de la base de données en prenant quelques mesures préventives :
- Créer de meilleurs index
- Ajuster les priorités des transactions
- Activer un modèle Essayer/Réessayer
- Modifier les modes d'isolement
- Maintenir les verrous le moins longtemps possible
- Accéder aux ressources dans le même ordre à chaque fois
- Ne soumettez pas une transaction tant que vous n'avez pas toutes les informations dont vous avez besoin
- Limiter l'escalade de verrouillage
Bien qu'il ne soit pas possible d'empêcher complètement le blocage de SQL Server, vous pouvez mettre en œuvre ces meilleures pratiques et contourner de manière proactive certaines des sources de blocage les plus courantes pour assurer le bon déroulement des transactions et optimiser les performances de la base de données.