当前位置:网站首页>MySQL Advanced Series: Locks - Locks in InnoDB

MySQL Advanced Series: Locks - Locks in InnoDB

2022-06-24 16:02:00 M. Ji.

Création continue,Accélérer la croissance!C'est ma participation「Nouveau plan de la Journée des Nuggets · 6 Le défi de la lune」De6Oh, mon Dieu.,Cliquez pour voir les détails de l'événement

MySQLVerrouillage-InnoDBL'état de la serrure

mysql> select @@version;
+-----------+
| @@version |
+-----------+
| 5.7.21    |
+-----------+
1 row in set (0.01 sec)

Un.,Introduction de base à la serrure

Par rapport à d'autres bases de données,MySQLVerrouillage d'une technologie de contrôle de la concurrence,Ses caractéristiques les plus remarquables sont différentesMoteur de stockagePrise en charge des différents mécanismes de verrouillage.Par exemple,,MyISAMEtMEMORYMais par rapport à d'autres bases de données(table-level locking);InnoDBLe moteur de stockage supporte à la fois les serrures de niveau de ligne(row-level locking),Les serrures de table sont également prises en charge,Mais par défaut, le verrouillage au niveau de la ligne est utilisé.

Serrure de table:Faible coût,Verrouillez!;Il n'y aura pas d'impasse.;Gros grain de verrouillage,La probabilité de conflit de serrure est la plus élevée,La concurrence est la plus faible.

Verrouillage des rangées:Frais généraux élevés,Verrouillage lent;Il y aura une impasse.;Taille minimale des particules verrouillées,Par défaut, le verrouillage au niveau de la ligne est utilisé,Les caractéristiques des serrures de semences sont les suivantes:La concurrence est également la plus élevée.

Type de verrouillage au niveau de la rangée:

Record Lock(Serrure d'enregistrement): Quand une serrure enregistrée ( Verrouiller un seul enregistrement )

Le verrouillage des enregistrements ne verrouille que les enregistrements indexés ,SiInnoDB La table de stockage n'a pas d'index au moment de la création , Cette serrure est verrouillée à l'aide d'une clé primaire implicite ,Comme le montre la figure ci - dessous:

Gap Lock(Serrure de dégagement):Verrouiller une plage,À l'exclusion des documents eux - mêmes( Verrouillez seulement les données avant GAP)

La serrure ci - dessous est GAPVerrouillage, Est que d'autres transactions ne sont pas autorisées dans la colonne Index 8 L'écart précédent insère un nouvel enregistrement ,C'est - à - dire(3 , 8)Cette section.gapVerrouillage Pour empêcher l'insertion d'un enregistrement fantôme

Next-Key Lock(Serrure à clé temporaire): Verrouiller l'enregistrement et l'enregistrement avant GAP,C'est - à - direNext-Key Lock = Record Lock + Gap Lock.

2.,Classification des serrures

Serrure partagée Share Locks (AbréviationsSVerrouillage, Appartient à la serrure de ligne )

Verrouillez - le. Exclusive Locks (AbréviationsXVerrouillage, Appartient à la serrure de ligne )

Intention de partager la serrure Intention Share Locks (AbréviationsISVerrouillage,Appartient à la serrure de table)

Verrouillage exclusif intentionnel Intention Exclusive Locks (AbréviationsIXVerrouillage,Appartient à la serrure de table)

Auto - verrouillage AUTO-INC Locks(Appartient à la serrure de table)

Chaque type de serrure est décrit ci - dessous. , Commençons par construire un innodbTableau,sqlComme suit

create table tab_with_index(id int,name varchar(10)) engine=innodb;
alter table tab_with_index add index id(id);
insert into tab_with_index values(1,'1'),(2,'2'),(3,'3'),(4,'4');

Serrure partagée

Une serrure partagée est une serrure dans laquelle plusieurs transactions peuvent être partagées pour les mêmes données, Accès à la base de données ,Mais je ne peux pas le modifier.;

ServicesA:

select * from tab_with_index lock in share mode;

ServicesB:

select * from tab_with_index where id =1; // Vous pouvez interroger les données

update tab_with_index set name = 'aa' where id = 1 ;

Attention!: Les modifications ici sont bloquées ,Jusqu'à ce que la transactionA L'opération ne peut réussir qu'après la soumission .

Verrouillez - le.

La serrure exclusive ne peut pas coexister avec d'autres serrures,Si une transaction obtient un verrouillage exclusif pour une ligne de données, Aucune autre transaction ne peut obtenir le verrouillage de cette ligne , Seules les transactions qui obtiennent actuellement des serrures exclusives peuvent modifier les données .(delete,update,create La valeur par défaut est exclusive lock )

ServicesA:

select * from tab_with_index where id =1 for update;

ServicesB:

select * from tab_with_index where id =1; //Les résultats sont disponibles

select * from tab_with_index where id =1 for update; // Colmatage

select * from tab_with_index where id = 1 lock for share mode; // Colmatage

Attention!:ServicesBDeux.sql Ça va bloquer , C'est - à - dire qu'il n'y a pas de serrure partagée ni de serrure exclusive ,Jusqu'à ce que la transactionA L'opération ne peut réussir qu'après la soumission .

Serrure de partage d'intention et serrure exclusive d'intention

Intention de partager la serrure:Indique que la transaction est prête à ajouter un verrou partagé à la ligne de données, C'est - à - dire qu'une ligne de données doit obtenir le ISVerrouillage.

Verrouillage exclusif intentionnel: Indique que la transaction est prête à ajouter un verrouillage exclusif à la ligne de données , C'est - à - dire qu'une ligne de données doit être obtenue avant qu'elle ne soit verrouillée. IXVerrouillage.

ISSerrures etIXLa serrure est une serrure de table, Ils n'ont proposé que d'ajouter des niveaux SSerrures etXLe verrouillage permet de déterminer rapidement si les enregistrements du tableau sont verrouillés,Pour éviter de parcourir les tables pour voir s'il y a des enregistrements verrouillés,C'est - à - dire, en fait,ISSerrures etIXLes serrures sont compatibles,IXSerrures etIXLes serrures sont compatibles. 《MySQLComment fonctionne - t - il?》

Auto - verrouillage

Un verrouillage spécial au niveau du tableau pour l'auto - inscription et l'auto - croissance.

show variables like 'innodb_autoinc_lock_mode'; 
-- Par défaut1,Représentant continu, Si la transaction n'est pas engagée IDPerte permanente

Trois,InnoDBVerrouillage

1、Affaires etACIDPropriétés

Les transactions sont effectuées par un groupeSQLUnit é de traitement logique composée d'énoncés,La transaction a4Propriétés,Communément appelé transactionACIDPropriétés.

Atomicité(Actomicity):La transaction est une unit é d'exploitation atomique,Modification des données,Ou tout.,Soit ils ne le font pas tous. Cohérence(Consistent):Au début et à la fin de la transaction,Les données doivent être cohérentes. Isolement(Isolation):Le système de base de données fournit un mécanisme d'isolement,S'assurer que la transaction n'est pas affectée par des opérations simultanées externes“Indépendance”Exécution environnementale. Persistance(Durable):Une fois la transaction terminée,Il s'agit d'une modification permanente des données,Peut être maintenu même en cas de défaillance du système.

2、Problèmes posés par les transactions simultanées

Par rapport au traitement en série,Le traitement simultané des transactions peut grandement accroître l'utilisation des ressources de la base de données.,Améliorer le débit de transaction du système de base de données,Cela permet des opérations simultanées pour un plus grand nombre d'utilisateurs,Mais en même temps,,Ça va poser un problème:

Sale lecture.: Une transaction modifie un enregistrement,Avant que cette transaction ne soit engagée,Les données de cet enregistrement sont incohérentes;À ce moment - là,,Une autre transaction vient aussi lire le même enregistrement,Sans contrôle,La deuxième transaction lit ceci“Sale.”Données,Et d'autres traitements en conséquence,Les dépendances de données non engagées se produiront.Ce phénomène est appelé“Sale lecture.”

Non répétable:Une transaction qui lit certaines données a changé、Ou certains enregistrements ont été supprimés!Ce phénomène s'appelle“Non répétable”.

Lecture fictive: Une transaction relit les données précédemment récupérées selon les mêmes critères de requête,D'autres transactions ont été trouvées insérant de nouvelles données qui répondent à leurs critères de requête,Ce phénomène s'appelle“Lecture fictive”

Les problèmes ci - dessus sont liés à la cohérence de la lecture de la base de données.,Peut être garanti par un mécanisme d'isolement des transactions.

Plus l'isolement des transactions de la base de données est strict,Plus les effets secondaires concomitants sont faibles,Mais plus le prix est élevé,Parce que l'isolement des transactions est essentiellement de sérialiser les transactions dans une certaine mesure,Le niveau d'isolement à utiliser doit être déterminé en fonction des besoins opérationnels spécifiques.

Sale lecture.Non répétableLecture fictive
read uncommitted
read committed
repeatable read
serializable

Peut passer l'inspectionInnoDB_row_lockVariables d'état pour analyser la concurrence pour les serrures de ligne sur le système:

mysql> show status like 'innodb_row_lock%';
+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| Innodb_row_lock_current_waits | 0     |
| Innodb_row_lock_time          | 18702 |
| Innodb_row_lock_time_avg      | 18702 |
| Innodb_row_lock_time_max      | 18702 |
| Innodb_row_lock_waits         | 1     |
+-------------------------------+-------+
--Si vous trouvez que la contestation de verrouillage est grave,Par exemple:InnoDB_row_lock_waitsEtInnoDB_row_lock_time_avgLa valeur de est plus élevée

3、InnoDBMode de verrouillage de ligne et méthode de verrouillage

Serrure partagée(S) :Aussi connu sous le nom de serrure de lecture(lock in share mode).Autoriser une transaction à lire une ligne,Empêcher d'autres transactions d'obtenir des serrures exclusives pour le même ensemble de données.Si la transactionTPour les objets de donnéesAPlusSVerrouillage,Alors la transactionTPeut lireAMais il ne peut pas être modifiéA,D'autres transactions ne peuvent être faites queAPlusSVerrouillage,Au lieu d'ajouterXVerrouillage,Jusqu'àTReleaseAOui.SVerrouillage.Cela garantit que d'autres questions peuvent être luesA,Mais dansTReleaseAOui.SPas avant la fermetureAApporter des modifications. ​ Verrouillage exclusif(X) :Aussi connu sous le nom de Write Lock(for update).Autoriser l'accès aux données de mise à jour des transactions pour les serrures exclusives,.Empêcher d'autres transactions d'obtenir le même ensemble de données partager le verrou de lecture et le verrou d'écriture exclusif.Si la transactionTPour les objets de donnéesAPlusXVerrouillage,ServicesTPeut lireAPeut également être modifiéA,D'autres affaires ne peuvent plus être justesAAvec n'importe quelle serrure,Jusqu'àTReleaseALa serrure sur.

mysql InnoDBModifier l'instruction de données par défaut du moteur:update,delete,insertLes données sont automatiquement verrouillées à l'exclusion des données impliquées,selectL'instruction par défaut n'ajoute aucun type de verrouillage,Si une serrure exclusive peut être utiliséeselect …for updateDéclarations,La serrure partagée peut être utiliséeselect … lock in share modeDéclarations. Par conséquent, les lignes de données verrouillées de façon exclusive ne peuvent pas être modifiées dans d'autres transactions. ,Ni passerfor updateEtlock in share modeMéthode de verrouillage pour interroger les données,Mais ça peut passer directement parselect …from…Recherche de données,Parce que les requêtes ordinaires n'ont pas de mécanisme de verrouillage.

4、InnoDBMode de réalisation du verrouillage de ligne

InnoDBLa serrure de ligne passe parIndexL'entrée de l'index est verrouillée,C'est ça.MySQLAvecOracleC'est différent.,Ce dernier est réalisé en verrouillant la ligne de données correspondante dans le bloc de données.InnoDBCette fonctionnalité de verrouillage de ligne signifie:Les données ne sont récupérées que par condition d'index,InnoDBPour utiliser la serrure de niveau de ligne,Sinon,InnoDBLe verrou de table sera utilisé!

1、Lorsqu'une requête ne passe pas par les critères d'index,innodbUtilisez un verrou de table au lieu d'un verrou de ligne

create table tab_no_index(id int,name varchar(10)) engine=innodb;
insert into tab_no_index values(1,'1'),(2,'2'),(3,'3'),(4,'4');
session1session2
set autocommit=0 select * from tab_no_index where id = 1;set autocommit=0 select * from tab_no_index where id =2
select * from tab_no_index where id = 1 for update
select * from tab_no_index where id = 2 for update;

session1Il n'y a qu'une rangée de serrures exclusives.,Maissession2Lors de la demande de verrouillage exclusif pour d'autres lignes,Il y aura une serrure en attente.Parce qu'il n'y a pas d'index,innodbN'utilisez que des serrures de table.

2、Créer une table indexée pour la requête conditionnelle,innodbLes serrures de ligne sont utilisées

create table tab_with_index(id int,name varchar(10)) engine=innodb;
alter table tab_with_index add index id(id);
insert into tab_with_index values(1,'1'),(2,'2'),(3,'3'),(4,'4');
session1session2
set autocommit=0 select * from tab_with_indexwhere id = 1;set autocommit=0 select * from tab_with_indexwhere id =2
select * from tab_with_indexwhere id = 1 for update
select * from tab_with_indexwhere id = 2 for update;

3、Parce quemysqlLa serrure de ligne pour est une serrure indexée,Pas de serrure pour l'enregistrement,Donc, même si c'est l'accès aux dossiers des non - pairs,Mais les données spécifiques ne sont toujours pas accessibles( Voici le verrou de montre )

alter table tab_with_index drop index id;
insert into tab_with_index  values(1,'4');
session1session2
set autocommit=0set autocommit=0
select * from tab_with_index where id = 1 and name='1' for update
select * from tab_with_index where id = 1 and name='4' for update Bien quesession2L'accès est etsession1Différents enregistrements, Mais c'est une montre. ,Il faut attendre la serrure

Résumé

PourInnoDBTableau,Cet article traite principalement des éléments suivants:: (1)InnoDBLe verrouillage de ligne est basé sur l'index,Si les données ne sont pas accessibles par index,InnoDBLes serrures de table seront utilisées. (2)Sous différents niveaux d'isolement,InnoDBLe mécanisme de verrouillage et la stratégie de lecture cohérente sont différents.

Pour comprendreInnoDBAprès la fonction de verrouillage,L'utilisateur peut concevoir etSQLMesures telles que le réglage pour réduire les collisions de serrures et les blocages,Y compris::

  • Essayez d'utiliser un niveau d'isolement inférieur; Index soigneusement conçu,Et essayez d'utiliser l'index pour accéder aux données,Pour rendre le verrouillage plus précis,Réduire les risques de conflit de serrures;
  • Choisir une taille de transaction raisonnable,Les petites transactions sont également moins susceptibles d'entrer en conflit avec les serrures;
  • Lors du verrouillage explicite de l'enregistreur,Il est préférable de demander un niveau de verrouillage suffisant à la fois.Par exemple, pour modifier les données,Il vaut mieux demander directement la serrure exclusive,Au lieu de demander d'abord une serrure partagée,Demande une serrure exclusive lors de la modification,C'est facile à bloquer;
  • Lorsque différents programmes accèdent à un ensemble de tableaux,Dans la mesure du possible, il est convenu d'accéder aux tableaux dans le même ordre.,Pour un tableau,Dans la mesure du possible, accédez aux lignes du tableau dans un ordre fixe.Cela réduit considérablement les chances d'impasse;
  • Essayez d'accéder aux données dans des conditions d'égalité,Cela évite l'effet des serrures de dégagement sur les Inserts simultanés; Ne pas appliquer plus que nécessaire;Sauf si c'est nécessaire.,Ne pas afficher le verrouillage lors de la requête;
  • Pour certaines transactions,Les serrures de table peuvent être utilisées pour accélérer le traitement ou réduire le risque d'impasse.

C'est M. Ji.,Apprendre continuellement en inversant l'entrée avec la sortie,Partager continuellement la série technique,Et l'ensemble du réseau mérite d'être collecté,Bienvenue au public,Être un technicien en croissance continue.

mysql Série avancée articles historiques

(Voir aussi d'autres articles connexes dans la rubrique Nuggets)

1. MySQLSérie avancée:Je comprends.mysqlInfrastructure;

2. MySQLSérie avancée:Je comprends.mysqlMoteur de stockage;

3. MySQLSérie avancée:mysqlMoyenneMyISAMEtInnoDBQuelle est la différence?;

4. MySQLSérie avancée:mysql Comment choisir un meilleur type de données ;

5. MySQLSérie avancée: Comment utiliser les paradigmes dans la conception des bases de données ;

6. MySQLSérie avancée:Un article détailléexplainSignification de chaque champ;

7. MySQLSérie avancée:PourquoimysqlUtiliserB+Structure des données en tant qu'index;

8. MySQLSérie avancée:   Quelques bases d'indexation que vous devez connaître ;

9. MySQLSérie avancée: Comment créer un index plus approprié ;

10. MySQLSérie avancée: Principe et configuration de la réplication maître - esclave ;

11. MySQLSérie avancée:joinLe principe de connexion-3Algorithme;

12. MySQLSérie avancée: Transactions et niveaux d'isolement des transactions ;

13. MySQLSérie avancée:Contrôle de la concurrence Multi - VersionsmvccRéalisation;

14. MySQLSérie avancée:Un articlesqlComment ça s'est passé;

15. MySQLSérie avancée: Ce que vous devez savoir MySQLLog;

16. MySQLSérie avancée:MySQL Copie maître - esclave et principe ;

17. MySQLSérie avancée:MySQLLa serrure dans-MyISAMArticles;

原网站

版权声明
本文为[M. Ji.]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/175/202206241549548125.html