Maison >base de données >tutoriel mysql >Quels sont les verrous partagés, les verrous exclusifs et les blocages d'intention de MySQL ?
Les verrous au niveau des lignes doivent généralement être utilisés pour garantir l'intégrité des transactions, et c'est également l'une des raisons courantes de choisir le moteur InnoDB. Cependant, dans des cas individuels, des verrous au niveau de la table peuvent également être requis.
La transaction doit mettre à jour la plupart ou la totalité des données, et la table est relativement volumineuse. Si le verrouillage de ligne par défaut est utilisé, non seulement l'efficacité de l'exécution de la transaction sera faible, mais cela peut également entraîner l'attente d'autres transactions. longtemps et conflits de verrouillage. La transaction implique plusieurs tables, ce qui est plus compliqué, cela est susceptible de provoquer un blocage et de provoquer un grand nombre d'annulations de transactions
Lorsque nous voulons obtenir un verrouillage de table, exécutez la commande suivante :
Lors de l'utilisation des verrous de table, les enjeux d'efficacité impliqués :
Pour obtenir un verrou de table Pour utiliser un verrou partagé S ou un verrou exclusif X sur une table, vous devez au préalable vous assurer que cette table n'a pas été acquise par d'autres transactions.
Supposons que nous ayons 10 millions de données dans ce tableau, comment déterminer quelles lignes de ces 10 millions de données ont X verrous ?
Si vous souhaitez obtenir le verrou S de la table, vous devez déterminer quelles lignes du tableau ont des verrous X. Si certaines lignes ont des verrous X, vous ne pouvez pas obtenir le verrou S ou le verrou X de cette table. Il n'y a pas de meilleur moyen que de vérifier une par une, ce qui conduit à une inefficacité. L'inefficacité est causée par la nécessité d'ajouter des verrous de table et de parcourir les données une par une pour déterminer si certaines données ont des verrous de ligne. Le verrouillage partagé d'intention et le verrouillage exclusif d'intention que nous apprenons ici peuvent être résolus
. 2. Verrouillage partagé d'intention et verrouillage exclusif d'intention
Le plan de transaction ajoute un verrou partagé de ligne à l'enregistrement. La transaction doit d'abord obtenir la table avant d'ajouter un verrou partagé à l'enregistrement. une rangée d'enregistrements. Verrouillage IS
Le plan de transaction ajoute un verrou exclusif de ligne à l'enregistrement. Avant que la transaction n'ajoute un verrou exclusif à une ligne d'enregistrements, la transaction doit d'abord être effectuée. obtenir le verrou IX de la table
et ne provoquera pas de conflits. Il s'agit principalement d'aider les autres dans le processus. Accélérer l'efficacité lors de l'acquisition des verrous de table
, pas de verrous de ligne !)
, coordonne la coexistence des verrous de table et des verrous de ligne. L'objectif principal est de montrer qu'une transaction verrouille une ligne ou tente de verrouiller une ligne.
Lorsque la transaction 1 doit ajouter un verrou Got the IX. Lorsque la transaction 2 veut acquérir le verrou S de la table entière, elle voit qu'une autre transaction a acquis le verrou IX sur cette table, ce qui signifie qu'il doit y avoir des données dans cette table qui ont été ajoutées au verrou X, ce qui entraîne dans la transaction 2, vous ne pouvez pas ajouter le verrou S à la table entière. Pour le moment, la transaction 2 ne peut qu'attendre et ne peut pas obtenir le verrouillage de la table S
3 Deadlock
Les problèmes de blocage sont généralement causés par nous-mêmes. Semblables à la situation de blocage dans la programmation multi-thread, la plupart d'entre eux sont causés par l'ordre différent dans lequel nos multiples threads acquièrent plusieurs ressources de verrouillage. Par conséquent, lorsque nous utilisons différents segments de code pour mettre à jour plusieurs tables de la base de données, ces tables doivent être mises à jour dans le même ordre pour éviter que les conflits de verrouillage ne provoquent des problèmes de blocage. 2. Scénarios de blocage et solutions
Les scénarios dans lesquels un blocage se produit sont les suivants :La transaction 1 acquiert avec succès le verrou de ligne 1La transaction 2 acquiert avec succès le verrou de ligne 2…
La transaction 1 ne peut pas acquérir le verrou de ligne 2, Lorsqu'il est bloqué, il n'y a aucun moyen d'exécuter une validation/annulation et le verrou de ligne 1 ne peut pas être libéréLa transaction 2 ne peut pas acquérir le verrou de ligne 1. Lorsqu'elle est bloquée, il n'y a aucun moyen d'exécuter une validation/annulation et le verrou de ligne 2 ne peut pas être libéré
Méthodes pour résoudre les blocages : Lorsque plusieurs transactions/threads acquièrent plusieurs verrous de ressources identiques, elles doivent acquérir des verrous de ressources dans le même ordre.
La transaction est bloquée ou bloquée. Mysqld (démon MySQL Server) est défini avec un délai d'attente pour le blocage de la transaction La transaction ne sera pas bloquée pendant une longue période. Après le délai d'attente, le traitement de la transaction échoue et est actuellement occupé. le verrou est automatiquement libéré.
Définissez les niveaux d'isolement de validation manuelle et de lecture répétable et démarrez la transaction
Interrogez les données de la table Dans le niveau d'isolement de lecture répétable, l'instantané lu fourni par MVCC est utilisé, et il n'y a pas de données. verrouillage
La transaction 1 acquiert le verrou exclusif avec id=7, la transaction 2 acquiert le verrou exclusif avec id=8
La transaction 1 acquiert à nouveau le verrou exclusif avec id=8 et le blocage se produit
La transaction 2 l'acquiert à nouveau. Le verrou exclusif avec l'identifiant = 7 est bloqué
À ce moment, le serveur MySQL détecte qu'un blocage s'est produit, il débloque donc la transaction 1, annule la transaction 1 et libère le verrou de ligne. il tient, donc transaction 2 Vous avez obtenu avec succès le verrou exclusif avec id=7
En partant du principe que l'entreprise peut être complétée correctement, afin d'assurer l'efficacité, essayez d'utiliser un isolement inférieur niveau (les lectures sales doivent être évitées)
Concevez des index raisonnables et essayez d'utiliser des index pour accéder aux données pour rendre le verrouillage plus précis, réduire les risques de conflits de verrouillage et améliorer les capacités de concurrence
Choisissez un niveau raisonnable la taille de la transaction et la probabilité de conflits de verrouillage pour les petites transactions est faible (plus la transaction est grande, plus elle contient de SQL et elle peut contenir plus de verrous de ressources de table et de ressources de ligne, augmentant la probabilité de conflits de verrouillage) Lorsque différents programmes accèdent à un groupe de tables, ils doivent essayer de se mettre d'accord pour accéder à chaque table dans le même ordre, pour une table, accéder autant que possible aux lignes du tableau dans un ordre fixe. Cela peut réduire considérablement le risque de blocage
Essayez d'utiliser des conditions égales pour accéder aux données. Cela peutéviter l'impact des verrous d'espacement sur l'insertion simultanée (en fait, les requêtes équivalentes ajouteront également des verrous d'espacement). pour un niveau de verrouillage qui dépasse le besoin réel.
Si cela n'est pas nécessaire, vous devez éviter d'utiliser le verrouillage explicite lors de l'interrogation, car sous les niveaux d'isolement de lecture validée et de lecture répétable, MVCC a fourni un mécanisme de lecture sans verrouillage manuel
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!