2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Table des matières
1. Brève description des verrous de base de données
2. Brève description du verrouillage de l'espace
3. Comment les verrous au niveau des lignes sont implémentés dans InnoDB
4. Dans quelles circonstances un blocage se produira-t-il dans la base de données ?
5. Décrivez brièvement la solution au blocage de la base de données
Les verrous sont une fonctionnalité clé qui distingue les systèmes de base de données des systèmes de fichiers. Le mécanisme de verrouillage est utilisé pour gérer l'accès simultané aux ressources partagées. Prenons comme exemple le moteur InnoDB de la base de données MySQL pour présenter brièvement les caractéristiques des verrous.
Si une transaction T1 a obtenu le verrou partagé de la ligne r, alors une autre transaction T2 peut immédiatement obtenir le verrou partagé de la ligne r, car la lecture ne modifie pas les données de la ligne r. Cette situation est appelée compatibilité des verrous.Mais si une autre transaction T3 veut obtenir le verrou exclusif sur la ligne r, elle doit attendre que les transactions T1 et T2 libèrent le verrou partagé sur la ligne r. Cette situation est appelée.serrure incompatible . La figure suivante montre la compatibilité des verrous partagés et des verrous exclusifs. On peut constater que le verrou X est incompatible avec n'importe quel verrou, tandis que le verrou S n'est compatible qu'avec le verrou S. Il est important de noter que les verrous S et X sont tous deux des verrous de ligne et que la compatibilité fait référence à la compatibilité des verrous sur le même enregistrement (ligne).
X | S | |
X | Pas compatible | Pas compatible |
S | Pas compatible | compatible |
Verrouiller la granularité : Le moteur de stockage InnoDB prend en charge le verrouillage multi-granularité, ce qui permet aux transactions d'avoir simultanément des verrous au niveau des lignes et des verrous au niveau des tables. Afin de prendre en charge les opérations de verrouillage à différentes granularités, le moteur de stockage InnoDB prend en charge une méthode de verrouillage supplémentaire appelée verrouillage d'intention. Les verrous d'intention divisent les objets verrouillés en plusieurs niveaux. Les verrous d'intention signifient que les transactions souhaitent se verrouiller avec une granularité plus fine.
Le moteur de stockage InnoDB prend en charge une conception relativement simple de verrous d'intention, et ses verrous d'intention sont des verrous au niveau de la table. L'objectif principal de la conception est de révéler le type de verrou demandé pour la ligne suivante d'une transaction. Il prend en charge deux types de verrous d'intention :
1. Intention Shared Lock (IS Lock), la transaction souhaite obtenir des verrous partagés pour certaines lignes d'une table.
2. Intention de verrouillage exclusif (IX Lock), la transaction souhaite obtenir des verrous exclusifs sur certaines lignes d'une table.
Étant donné que le moteur de stockage InnoDB prend en charge les verrous au niveau des lignes, les verrous d'intention ne bloqueront en réalité aucune requête, à l'exception des analyses complètes de table. Ainsi, la compatibilité des verrous d’intention au niveau de la table et des verrous au niveau des lignes est la suivante :
EST | IX | S | X | |
EST | compatible | compatible | compatible | Pas compatible |
IX | compatible | compatible | Pas compatible | Pas compatible |
S | compatible | Pas compatible | compatible | Pas compatible |
X | Pas compatible | Pas compatible | Pas compatible | Pas compatible |
algorithme de verrouillage: Le moteur de stockage InnoDB dispose de trois algorithmes de verrouillage de ligne, qui sont :
1. Verrouillage d'enregistrement : verrouillez un enregistrement à une seule ligne.
2. Verrouillage de l'espace : verrouillage de l'espace, verrouillage
3. Next-Key Lock : Gap Lock + Record Lock, verrouillez une plage et verrouillez l'enregistrement lui-même.
Record Lock verrouillera toujours les enregistrements d'index. Si la table du moteur de stockage InnoDB n'est configurée avec aucun index lors de sa création, le moteur de stockage InnoDB utilisera la clé primaire implicite pour le verrouillage. Next-Key Lock est un algorithme de verrouillage qui combine Gap Lock et Record Lock. Sous l'algorithme Next-Key Lock, InnoDB utilise cet algorithme de verrouillage pour les requêtes de ligne. La technologie de verrouillage utilisant Next-Key Lock est appelée Next-Key Locking et sa conception n'est pas destinée à résoudre le problème fantôme (lecture fantôme). Grâce à cette technologie de verrouillage, ce qui est verrouillé n'est pas une valeur unique, mais une plage, ce qui constitue une amélioration de Predict Lock.
À propos de l'impasse : L'impasse fait référence à un phénomène selon lequel deux ou plusieurs transactions s'attendent en raison de la concurrence pour les ressources lors de l'exécution. Sans force extérieure, les affaires ne pourront pas avancer.
mise à niveau du verrouillage :L'escalade de verrouillage fait référence à la réduction de la granularité du verrouillage actuel. Par exemple, la base de données peut mettre à niveau les 1 000 verrous de ligne d’une table vers un verrou de page, ou mettre à niveau un verrou de page vers un verrou de table.
Le moteur de stockage InnoDB n'a pas de problème de mise à niveau du verrouillage. Parce qu'il ne génère pas de verrous de ligne en fonction de chaque enregistrement, au contraire, il gère les verrous en fonction de chaque page accédée par chaque transaction, en utilisant une méthode bitmap. Par conséquent, qu'une transaction verrouille un ou plusieurs enregistrements dans la page, le coût est généralement le même.
Le moteur de stockage InnoDB dispose de trois algorithmes de verrouillage de ligne, et le verrouillage d'espacement (Gap Lock) en fait partie. Les verrous d'espacement sont utilisés pour verrouiller une plage, mais pas les enregistrements eux-mêmes. Son objectif est d'empêcher plusieurs transactions d'insérer des enregistrements dans la même plage, ce qui pourrait entraîner des problèmes de lecture fantôme.
Le verrouillage au niveau des lignes InnoDB est implémenté en verrouillant les entrées d'index sur l'index. InnoDB utilise des verrous au niveau des lignes uniquement lorsque les données sont récupérées via des conditions d'index, sinon InnoDB utilise des verrous de table.
Lorsque certaines lignes d'une table sont verrouillées, différentes transactions peuvent utiliser différents index pour verrouiller différentes lignes. De plus, que ce soit en utilisant un index de clé primaire, un index unique ou un index ordinaire, InnoDB utilisera des verrous de ligne pour verrouiller les données.
L'impasse fait référence à un phénomène dans lequel deux transactions ou plus s'attendent en raison de la concurrence pour les ressources lors de l'exécution. Sans force extérieure, les affaires ne pourront pas avancer.Le tableau suivant illustre une situation classique de blocage, c'est-à-dire que A attend B et B attend A. Ce problème de blocage est appeléImpasse AB-BA。
temps | Séance A | Séance B |
1 | COMMENCER: | |
2 | mysql>SÉLECTIONNEZ * DE t OÙ a = 1 POUR LA MISE À JOUR ; ************1.rangée************ a:1 1 ligne dans l'ensemble (0,00 sec) | COMMENCER: |
3 | mysql>SÉLECTIONNEZ * DE t OÙ a = 2 POUR LA MISE À JOUR ; ************1.rangée************ a:2 1 ligne dans l'ensemble (0,00 sec) | |
4 | mysql>SÉLECTIONNEZ * DE t OÙ a = 2 POUR LA MISE À JOUR ; #attendez | |
5 | mysql>SÉLECTIONNEZ * DE t OÙ a = 1 POUR LA MISE À JOUR ; ERREUR 1213(40001) : blocage détecté lors de la tentative d'obtention du verrou ; essayez de redémarrer la transaction |
Le moyen le plus simple de résoudre le problème de blocage consiste à expirer, c'est-à-dire que lorsque deux transactions s'attendent, lorsqu'un temps d'attente dépasse un seuil défini, l'une des transactions est annulée et l'autre transaction en attente peut continuer.
En plus du mécanisme de délai d'attente, les bases de données actuelles utilisent également généralement la méthode du graphique d'attente (wait graph) pour la détection des blocages. Il s'agit d'une approche plus proactive de la détection des interblocages que la solution de délai d'attente. Cette approche est également adoptée par le moteur de stockage InnoDB. Le graphique d'attente nécessite que la base de données stocke les deux types d'informations suivants :
1. Verrouiller la liste d'informations ;
2. Liste d'attente des transactions ;
Un graphique peut être construit via la liste chaînée ci-dessus, et s'il y a une boucle dans ce graphique, cela signifie qu'il y a une impasse, donc les ressources s'attendent les unes les autres. Il s'agit d'un mécanisme de détection de blocage plus actif. Lorsque chaque transaction demande un verrou et attend, il déterminera s'il y a une boucle. S'il existe, il y a un blocage. De manière générale, le moteur de stockage InnoDB choisit d'annuler la transaction. la plus petite quantité d'annulation.