Qu'est-ce que le blocage et comment cela se produit-il?

20

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?

jrara
la source

Réponses:

23

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é.

Serrures

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 incorrectes ne se produisent jamais, nous avons deux types principaux de verrous, les verrous de lecture et les verrous exclusifs.

Lecture verrouillée

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 de lecture sur une donnée, toutes les autres connexions doivent attendre que le verrou de 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.

Serrure exclusive

Si une connexion veut 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.

Impasse

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 liens ne sont pas du tout disposés à 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.)

Richard
la source
1
@Richard, comme vous l'avez mentionné si un blocage se produit, le SGBD entrera et choisira un perdant. Est-ce fait automatiquement par le SGBD? Ou un système mal conçu (qui connaît souvent des blocages) s'arrêterait-il jusqu'à ce qu'une personne lance le SGBD pour le faire?
CenterOrbit
2
Pour SQL Server, cela se fait automatiquement (à condition que la base de données puisse détecter le blocage ). Il pourrait avoir du mal à le détecter si, par exemple, il s'agit en fait d'un verrou actif .
Richard
Excellente et très complète réponse Richard. Un point supplémentaire sur les verrous actifs (qui ne devraient pas vraiment être comparés ou liés aux blocages, son simple blocage ancien) ... SQL empêchera la prise de verrous supplémentaires là où un verrou exclusif attend, IIRC après 4 verrous partagés se chevauchant successivement.
Mark Storey-Smith
5

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:

Tous les 3 sont des auteurs et / ou MVP SQL Server très connus.

Aaron Bertrand
la source