J'ai essayé de trouver des informations sur le blocage dans SQL Server, mais je n'ai pas pu trouver une explication concise de ce que c'est et comment cela se produit. Pourriez-vous, s'il vous plaît, m'éclairer?
Analogies
Parfois, il est utile d'utiliser des analogies loin des ordinateurs.
Disons que vous avez un ballon et deux enfants. Un seul enfant peut avoir le ballon à la fois. Cependant, si l'un des enfants reçoit le ballon et ne le lâche pas parce qu'il est distrait (regarder la télévision, par exemple), l'autre enfant ne pourra pas jouer avec le ballon.
L'autre enfant est bloqué de cette ressource.
Si nous comparons cela à la télévision, par exemple, plusieurs enfants peuvent regarder la télévision à un moment donné.
Verrous
Si nous passons au monde de la base de données, nous voyons qu'il existe différentes façons d'utiliser les ressources (tout comme nos deux exemples ci-dessus). Nous pouvons effectuer des "lectures" ou des "écritures".
Lorsque nous voulons lire les données, il n'y a aucune raison que les autres ne puissent pas lire les données également - tout comme deux personnes regardent la télévision. Cependant, si nous voulons écrire les données, nous devons nous assurer que personne d'autre ne les regarde. S'ils le lisent pendant que nous l'écrivons, ils obtiendront des lectures "sales". (Cela signifie qu'ils verront les données partiellement écrites, qui ne seront pas valides.)
Afin de garantir que ces lectures sales ne se produisent jamais, nous avons deux types principaux de verrous, les verrous de lecture et les verrous exclusifs.
Verrou de lecture
Vous pouvez avoir plusieurs connexions différentes lisant à partir de la même source de données à un moment donné. Mais pour s'assurer que personne ne modifie ces données pendant leur lecture, ils retirent un verrou de lecture.
Une fois qu'une connexion a un verrou en lecture sur une donnée, toutes les autres connexions doivent attendre que le verrou en lecture soit libéré avant de pouvoir écrire les données. D'autres peuvent toutefois supprimer leurs propres verrous de lecture sur cette même donnée.
Verrouillage exclusif
Si une connexion souhaite mettre à jour/insérer/supprimer une donnée, elle doit retirer un verrou exclusif. Cela empêche toute autre connexion de retirer également un verrou sur les données (ce qui rend le verrou exclusif à cette connexion).
Lorsqu'une connexion a un verrou exclusif sur les données, aucune autre connexion ne peut lire les données. Cela permet d'éviter les lectures incorrectes en garantissant que personne ne peut lire les données pendant leur écriture.
Blocage
Le "blocage" est simplement un terme qui signifie qu'une connexion détient un verrou sur une ressource lorsqu'une autre connexion souhaite y lire ou y écrire. Cela ne signifie pas nécessairement que la connexion propriétaire ne la libérera pas, mais simplement qu'elle la détient actuellement.
Comparez cela à l'affaire avec un enfant tenant le ballon. L'enfant tenant le ballon empêche tous les autres enfants de tenir le ballon.
Blocage
Je sais que vous ne l'avez pas demandé, mais ce n'est qu'une étape de plus pour arriver aux blocages (et c'est très directement lié au blocage).
Des interblocages peuvent se produire lorsque vous avez deux connexions qui ont chacune un verrou, mais qu'elles veulent des ressources mutuelles. Dans ce scénario, c'est comme deux enfants qui ont chacun une balle, mais qui veulent la balle de l'autre.
Comme les enfants, ces relations ne sont pas du tout disposées à partager. Chaque connexion a besoin d'accéder aux deux ressources pour continuer. Cependant, ils sont dans un état de blocage permanent. Dans cet état, le parent (SGBD) doit entrer et choisir un perdant afin que l'un des enfants (connexions) puisse avoir accès aux deux ressources.
Une fois cette connexion "gagnante" établie, elle libère les ressources, puis l'autre connexion ("perdante") peut réessayer d'accéder aux deux ressources.
Ainsi, le concept d'un blocage est lorsque vous avez deux ressources qui se bloquent.
Ici , vous pouvez en savoir plus sur tous les différents types de verrous que SQL Server a à offrir et les différentes ressources qui peuvent provoquer des blocages/blocages. L'article est ancien, mais il s'applique toujours à SQL Server 2000 à 2008 R2. (Il existe quelques autres types de verrous ajoutés aux versions ultérieures de SQL Server, mais cela vous donnera un point de départ.)
Grande explication par Richard, mais je voulais juste ajouter des liens vers la documentation officielle. Ces rubriques ont été écrites pour SQL Server 2000, mais la plupart des concepts restent les mêmes aujourd'hui:
Comprendre et éviter le blocage
Comprendre le verrouillage dans SQL Server
Modifier - quelques ajouts:
Five Ways to Fight Blocking Video - une toute nouvelle vidéo de Kendra Little (publiée aujourd'hui)
Le DBA en tant que détective: dépannage du verrouillage et du blocage - par Rodney Landrum
Comment identifier les problèmes de blocage avec SQL Profiler - par Brad McGehee
Tous les 3 sont des auteurs et/ou MVP SQL Server très connus.