Le mécanisme de verrouillage MySQL est divisé en verrous au niveau de la table et en verrous au niveau de la ligne. Cet article partagera avec vous mon partage et mon échange de verrous partagés et de verrous exclusifs dans les verrous au niveau de la ligne dans MySQL.
Le verrouillage partagé est également appelé verrouillage en lecture, ou verrouillage S en abrégé, le verrouillage partagé signifie que plusieurs transactions peuvent partager un verrou pour les mêmes données et qu'elles peuvent toutes accéder aux données, mais elles. ne peut que le lire et ne peut pas le modifier.
Le verrou exclusif est également appelé verrou en écriture, ou verrou X en abrégé, le verrou exclusif ne peut pas coexister avec d'autres verrous. Si une transaction acquiert un verrou exclusif sur une ligne de données, les autres transactions ne peuvent plus coexister. acquérir la ligne Les autres verrous incluent les verrous partagés et les verrous exclusifs, mais la transaction qui acquiert le verrou exclusif peut lire et modifier les données.
Tout le monde peut avoir une bonne compréhension des verrous partagés, c'est-à-dire que plusieurs transactions ne peuvent que lire les données mais pas modifier les données. Tout le monde peut avoir une compréhension différente des verrous exclusifs. J'ai fait une erreur au début, pensant cela. verrous exclusifs Une fois qu'une ligne de données est stockée, les autres transactions ne peuvent pas lire et modifier la ligne de données. Ce n'est pas le cas. Un verrou exclusif signifie qu'après qu'une transaction ajoute un verrou exclusif à une ligne de données, les autres transactions ne peuvent pas y ajouter d'autres verrous. L'instruction de modification des données par défaut du moteur mysql InnoDB, update, delete et insert ajoutera automatiquement des verrous exclusifs aux données impliquées. L'instruction select n'ajoutera aucun type de verrou par défaut. Si vous ajoutez un verrou exclusif, vous pouvez utiliser le. instruction select...for update Pour ajouter un verrou partagé, vous pouvez utiliser l'instruction select ... lock en mode partage. Par conséquent, les lignes de données avec des verrous exclusifs ne peuvent pas être modifiées dans d'autres transactions, et les données ne peuvent pas être interrogées pour la mise à jour et le verrouillage dans les verrous en mode partage, mais les données peuvent être interrogées directement via select...from..., car Ordinaire les requêtes n’ont aucun mécanisme de verrouillage.
Cela dit, jetons un coup d'œil à l'exemple simple suivant :
Nous avons les données de test suivantes
Maintenant, nous effectuons une requête exclusive sur la ligne de données avec id=1. Ici, nous utiliserons commencer pour ouvrir la transaction, et vous ne me verrez pas fermer la transaction. C'est pour tester, car valider la transaction ou annuler. la transaction libérera le verrou.
Ouvrez une fenêtre de requête
interrogera une donnée. Ouvrez maintenant une autre fenêtre de requête et utilisez une requête exclusive et une requête de verrouillage partagé pour les mêmes données. Façons d'interroger
Requête exclusive
Requête partagée
On voit que le verrou exclusif est activé La requête et la requête de verrouillage partagé seront dans un état de blocage, car les données avec id=1 ont été verrouillées avec un verrou exclusif et le blocage ici attend que le verrou exclusif soit libéré.
Et si on utilisait directement la requête suivante ?
On voit que les données peuvent être interrogées.
Regardons à nouveau une transaction qui acquiert un verrou partagé. Dans d'autres requêtes, nous ne pouvons ajouter que des verrous partagés ou non.
Nous voyons que nous pouvons interroger les données, mais nous ne pouvons pas les trouver si nous ajoutons un verrou exclusif, car les verrous exclusifs et partagés ne peuvent pas exister sur les mêmes données.
Enfin, nous vérifions le problème de l'ajout automatique de verrous exclusifs pour mettre à jour, supprimer et insérer des instructions dans le moteur mysql InnoDb mentionné ci-dessus
À ce stade. À ce moment-là, la requête partagée est en blocage, attendant la libération du verrou exclusif, mais les données peuvent être trouvées à l'aide de requêtes ordinaires, car le mécanisme de verrouillage ne s'exclut pas mutuellement avec le verrou exclusif, mais les données trouvées sont les anciennes données d'avant. les données sont modifiées.
Ensuite, nous soumettons les données, libérons le verrou exclusif et examinons les données modifiées. À ce moment, une requête exclusive, une requête partagée et une requête ordinaire peuvent être utilisées, car la requête exclusive. les données de la ligne sont publiées après la soumission de la transaction. Verrouillage exclusif, seules les requêtes ordinaires sont affichées ci-dessous, les autres étudiants peuvent vérifier par eux-mêmes.
Vous pouvez voir que le résultat est comme prévu.
Tutoriel recommandé : "Tutoriel MySQL"
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!