当前位置:网站首页>Verrouillage [MySQL]

Verrouillage [MySQL]

2022-07-06 08:23:00 Il y a le ciel quand on vole.

Verrouillage

Une serrure est un mécanisme par lequel un ordinateur coordonne plusieurs processus ou Threads pour accéder simultanément à une ressource.Dans la base de données,Les données sont également une ressource partagée.Comment assurer la cohérence de l'accès simultané aux données、L'efficacité est un problème que toutes les bases de données doivent résoudre,Les conflits de serrures sont également un facteur important qui influe sur le rendement de l'accès simultané à la base de données.

  • Global Lock:Verrouiller toutes les tables de la base de données.
  • Serrure de table:Verrouiller la table entière à chaque opération.
  • Verrouillage des rangées:Chaque opération Verrouille les données de ligne correspondantes.

Global Lock

Le verrouillage global est le verrouillage de l'Instance entière de la base de données,L'Instance entière est en lecture seule après le verrouillage,Inclusion ultérieureDMLDéclarations、DDLLes déclarations de commit transactionnel pour les déclarations seront bloquées.Son scénario d'utilisation typique est de faire une sauvegarde logique de l'ensemble de la bibliothèque,Verrouiller toutes les tables,Pour obtenir une vue cohérente,Assurer l'intégrité des données.
Insérer la description de l'image ici

# Plus de verrouillage global
flush tables with read lock;

# Sauvegarde des données
# WindowsLigne de commande
mysqldump -h39.105.19.217 -uroot –p123456 dataBaseName > scriptName.sql

# Relâchez la serrure.
unlock tables;

Caractéristiques:

  • Si vous sauvegardez sur la bibliothèque principale,Aucune mise à jour ne peut être effectuée pendant la sauvegarde,Les affaires se sont arrêtées.
  • Si vous sauvegardez à partir de la bibliothèque,Les journaux binaires qui ne peuvent pas être synchronisés à partir de la Bibliothèque primaire pendant la sauvegarde,Cela peut entraîner un retard maître - esclave.
# InnoDBMoteur de stockage, Sauvegarde cohérente des données sans verrouillage 
mysqldump --single-transaction -uroot –p123456 itcast > itcast.sql

Serrure de table

Serrure de table,Verrouiller la table entière à chaque opération.Gros grain de verrouillage,La probabilité de conflit de serrure est élevée,Faible concurrence.Appliqué àMyISAM、InnoDBAttendez dans le moteur de stockage.Pour les serrures de table,Il est principalement divisé en trois catégories::

  • Serrure de table
  • Verrouillage des métadonnées(meta data lock, MDL)
  • Verrouillage intentionnel

Serrure de table

  • Lisez la serrure.(Serrure partagée)
    Insérer la description de l'image ici
    Insérer la description de l'image ici

  • Écris la serrure.(Verrouillage exclusif)
    Insérer la description de l'image ici
    Insérer la description de l'image ici

# Lire la serrure
lock tables tableName read;
# Écris la serrure
lock tables tableName write;
# Relâchez la serrure.
unlock tables;

Conclusions:Lire la serrure ne bloque pas la lecture des autres clients,Mais ça bloque l'écriture.Les serrures d'écriture bloquent la lecture des autres clients,Ça bloque l'écriture des autres clients.

Verrouillage des métadonnées

MySQL5.5 Importer un verrou de métadonnées , Verrouillage automatique lors de l'accès à une table . Les métadonnées peuvent être comprises simplement comme la structure d'une table , Lorsqu'un tableau se rapporte à une transaction non engagée , Vous ne pouvez pas modifier la structure de ce tableau . Le verrouillage des métadonnées est conçu pour éviter DMLAvecDDLConflit,Assurer l'exactitude de la lecture et de l'écriture.
Insérer la description de l'image ici
Lorsque vous ajoutez un tableau 、Supprimer、Modifier、Pendant l'opération de recherche, Verrouillage partagé des serrures de données en dollars canadiens . Lors d'une opération de modification de la structure du tableau , Verrouillage exclusif des serrures de données en dollars canadiens .
Insérer la description de l'image ici
Insérer la description de l'image ici

#  Voir l'état des verrous de métadonnées dans la base de données 
select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks;

Verrouillage intentionnel

Pour éviterDMLAu moment de l'exécution,Conflit entre la serrure de ligne ajoutée et la serrure de table,InInnoDB Verrouillage d'intention introduit dans le moteur de stockage , De sorte que le verrou de table ne vérifie pas chaque ligne
Les données sont - elles verrouillées? ,Utiliser des serrures intentionnelles pour réduire l'inspection des serrures de table.
Insérer la description de l'image ici

  • Intention de partager la serrure(IS):Par déclarationselect … lock in share modeAjouter. Compatible avec les serrures partagées pour les serrures de table , Exclusion mutuelle des serrures exclusives des serrures de montre .
  • Verrouillage exclusif(IX):Parinsert、update、delete、select…for updateAjouter. Les serrures partagées et exclusives avec les serrures de table s'excluent mutuellement .
  • Les serrures d'intention ne s'excluent pas mutuellement,Une fois la transaction engagée,Intention de partager la serrure、 Les serrures d'intention exclusive sont automatiquement libérées .
    Insérer la description de l'image ici
    Insérer la description de l'image ici
# Voir l'état de verrouillage de la serrure d'intention et de la serrure de ligne
select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;

Verrouillage des rangées

Verrouillage des rangées,Chaque opération Verrouille les données de ligne correspondantes.Petite granularité de verrouillage,Faible probabilité de conflit de serrure,Haute concurrence.Appliqué àInnoDBDans le moteur de stockage.InnoDBLes données de,Le verrouillage de ligne est réalisé en verrouillant les entrées d'index sur l'index, Au lieu d'ajouter à l'enregistrement
Verrouillage.Pour les serrures de rangée,Il est principalement divisé en trois catégories::

  • Verrouillage des rangées: Verrouillage d'une seule ligne d'enregistrement ,Empêcher d'autres transactions d'effectuer cette ligneupdateEtdelete.InRead Commit、Repeatable ReadPrise en charge au niveau de l'isolement.
    Insérer la description de l'image ici

  • Serrure de dégagement:Verrouiller l'écart d'enregistrement de l'index(Sans cet enregistrement),S'assurer que l'écart entre les enregistrements indexés est constant,Empêcher d'autres transactions de se produire dans cet intervalleinsert,Pour produire des lectures fantaisistes.InRepeatable ReadPrise en charge au niveau de l'isolement.
    Insérer la description de l'image ici

  • Serrure à clé temporaire:Combinaison de serrures de ligne et de serrures de dégagement,Verrouiller les données en même temps,Et verrouiller l'espace avant les données.InRepeatable ReadPrise en charge au niveau de l'isolement.
    Insérer la description de l'image ici

Verrouillage des rangées

InnoDB Le moteur de stockage implémente les deux types de verrouillage de ligne suivants :

  • Serrure partagée(S):Autoriser une transaction à lire une ligne,Empêcher d'autres transactions d'obtenir un verrouillage exclusif pour le même ensemble de données.
  • Verrouillage exclusif(X):Autoriser l'accès aux données de mise à jour des transactions pour les serrures exclusives, Empêcher d'autres transactions d'obtenir des serrures partagées et des exclusions pour le même ensemble de données
    Verrouillage.
    Insérer la description de l'image ici
    Insérer la description de l'image ici
    Lors de la recherche d'un index unique,Lorsqu'une correspondance équivalente est faite pour un enregistrement existant,Sera automatiquement optimisé pour les serrures de ligne.InnoDB Le verrouillage de ligne du moteur de stockage est pour le verrouillage indexé , Lorsqu'il n'est pas indexé , Tous les enregistrements du tableau seront verrouillés , Le verrouillage de la table est mis à jour .
    Insérer la description de l'image ici
    Insérer la description de l'image ici
    Le client obtient idPour1 Serrure partagée pour cette ligne , Le client 2 peut obtenir idPour3 Cette rangée est fermée. , Parce que ce n'est pas la même ligne de données . Et si le client 2 veut obtenir idPour1 C'est une serrure exclusive. ,Sera bloqué, Je pensais que les serrures partagées et exclusives s'excluaient mutuellement .
    Insérer la description de l'image ici
    Quand le client I ,Mise en œuvreupdateDéclarations,Ce sera pouridPour1 Le dossier est verrouillé. .Client 2, Si elle est également appliquée updateMise à jour des déclarationsidPour1Données,Aussi pouridPour1 Les données sont verrouillées. , Mais le client 2 sera bloqué , Parce que les serrures exclusives s'excluent mutuellement . Jusqu'à ce que le client engage une transaction , Pour libérer la serrure de cette rangée , Le client 2 débloque maintenant .
    Insérer la description de l'image ici

Client 1 transaction ouverte ,Et la mise en œuvreupdateDéclarations,Mise à journamePourLilyDonnées,C'est - à - direidPour19Les dossiers de . Puis mettre à jour dans le client II idPour3Les dossiers de, Mais pas directement. ,Sera bloqué,Pourquoi?? Parce qu'à ce stade, le client est basé sur name Lorsque le champ est mis à jour nameLe champ n'est pas indexé,S'il n'y a pas d'index, La serrure de ligne passe à la serrure de table ( Parce qu'un verrou de ligne est un verrou ajouté à une entrée d'index ,EtnamePas d'index).
Insérer la description de l'image ici

# Voir l'état de verrouillage de la serrure d'intention et de la serrure de ligne
select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;

Serrure de dégagement et serrure à clé

Par défaut,InnoDBLe moteur de stockage estRepeatable ReadNiveau d'isolement des transactions en cours,Recherche et indexation à l'aide d'un verrou à clé temporaire,Pour éviter la fausse lecture.

  • Requête équivalente sur Index(Index unique),Lors du verrouillage d'un enregistrement inexistant,Optimisé pour les serrures de dégagement .
    Insérer la description de l'image ici

  • Requête équivalente sur Index(Index non unique),Lorsque la dernière valeur ne satisfait pas aux exigences de requête lors de la traversée à droite, La serrure à clé adjacente se dégrade en serrure de dégagement .

InnoDBMoteur de stockageB+Index des arbres, Les noeuds foliaires sont des listes bidirectionnelles ordonnées . Si, La valeur de la requête basée sur cet index secondaire est 18Données, Et avec une serrure partagée , On est enfermés. 18 Ça te va? ? Ce n'est pas, Parce que c'est un index non unique , Il peut y en avoir plusieurs dans cette structure 18L'existence de,Alors..., Continuez à regarder en arrière pendant que vous Verrouillez , Trouver une valeur qui ne répond pas aux critères ( Dans le cas présent, 29).Il y a un lien18Serrure à clé,Et oui.29 Verrouillage de l'espace avant .
Insérer la description de l'image ici
Insérer la description de l'image ici

  • Requête de plage sur index(Index unique),Accède à la première valeur qui ne satisfait pas à la condition.

Les critères de requête sont: id>=19, Et ajouter une serrure partagée . À ce stade, nous pouvons utiliser les données disponibles dans la table de base de données , Diviser les données en trois parties :[19]、(19,25]、(25,+∞]. Par conséquent, le verrouillage de la base de données est ,19Avec une serrure,25 Serrure à clé (Contient25Et25 Écart précédent ), C'est l'infini
Serrure à clé( Infini positif et dégagement précédent ).
Insérer la description de l'image ici
Attention!:Le verrouillage de l'écart a pour seul but d'empêcher d'autres transactions d'insérer l'écart..Les serrures de dégagement peuvent coexister,Un verrouillage d'écart appliqué par une transaction n'empêche pas une autre transaction d'appliquer un verrouillage d'écart sur le même intervalle.

RÉFÉRENCES:https://www.bilibili.com/video/BV1Kr4y1i7ru

原网站

版权声明
本文为[Il y a le ciel quand on vole.]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/187/202207060819574421.html