当前位置:网站首页>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étable | Lecture 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');
| session1 | session2 |
|---|---|
| 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');
| session1 | session2 |
|---|---|
| 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');
| session1 | session2 |
|---|---|
| set autocommit=0 | set 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 ;
边栏推荐
- Three solutions for Jenkins image failing to update plug-in Center
- Build go command line program tool chain
- ZOJ——4104 Sequence in the Pocket(思维问题)
- A new weapon to break the memory wall has become a "hot search" in the industry! Persistent memory enables workers to play with massive data + high-dimensional models
- Flink Kubernetes Application部署
- 微信公众号调试与Natapp环境搭建
- Here comes Wi Fi 7. How strong is it?
- 2021-05-04: given a non negative integer C, you need to judge whether there are two integers a and B, so that a*a+b*b=c.
- Apple is no match for the longest selling mobile phone made in China, and has finally brought back the face of the domestic mobile phone
- PyTorch中的转置卷积详解
猜你喜欢

MongoDB入門實戰教程:學習總結目錄

Cap: multiple attention mechanism, interesting fine-grained classification scheme | AAAI 2021
![[download attached] installation and simple use of Chinese version of awvs](/img/3b/f26617383690c86edff465c9a1099e.png)
[download attached] installation and simple use of Chinese version of awvs

Implement Domain Driven Design - use ABP framework - domain logic & application logic

Mysql之Binlog

I just came back from the Ali software test. I worked for Alibaba P7 in 3+1, with an annual salary of 28*15
![clang: warning: argument unused during compilation: ‘-no-pie‘ [-Wunused-command-line-argument]](/img/f0/42f394dbc989d381387c7b953d2a39.jpg)
clang: warning: argument unused during compilation: ‘-no-pie‘ [-Wunused-command-line-argument]

用 Oasis 开发一个跳一跳(一)—— 场景搭建

C. K-th Not Divisible by n(数学+思维) Codeforces Round #640 (Div. 4)

存在安全隐患 部分冒险家混动版将召回
随机推荐
Using alicloud RDS for SQL Server Performance insight to optimize database load - first understanding of performance insight
Leetcode 139. Mot break word Split (medium)
2021-04-22: given many line segments, each line segment has two numbers [start, end],
嵌入式开发基础之线程间通信
Why is it easy for enterprises to fail in implementing WMS warehouse management system
微信公众号调试与Natapp环境搭建
Global and Chinese markets of Leyte coin exchange 2022-2028: Research Report on technology, participants, trends, market size and share
找出隐形资产--利用Hosts碰撞突破边界
Some experiences of project K several operations in the global template
Global and Chinese market for commercial barbecue smokers 2022-2028: Research Report on technology, participants, trends, market size and share
【云原生 | Kubernetes篇】Kubernetes基础入门(三)
基于STM32的MD5校验
Rush for IPO, Hello, I'm in a hurry
Introduction to new features of ECMAScript 2019 (ES10)
[C language questions -- leetcode 12 questions] take you off and fly into the garbage
PyTorch中的转置卷积详解
New de debugging
Global and Chinese market of inverted syrup 2022-2028: Research Report on technology, participants, trends, market size and share
B. Ternary Sequence(思维+贪心)Codeforces Round #665 (Div. 2)
Istio FAQ: return 426 status code