Si vous travaillez avec MySQL depuis un certain temps, vous avez probablement entendu les termes « verrouillage au niveau de la table » et « verrouillage au niveau de la ligne ». Ces termes font référence à la granularité du verrou dans MySQL - dans ce blog, nous expliquerons ce qu'ils signifient et à quoi ils peuvent servir.
Qu'est-ce que la granularité de verrouillage dans MySQL ?
Chaque moteur de stockage MySQL prend en charge différents niveaux de granularité pour ses verrous. MySQL a trois niveaux de verrouillage :verrouillage au niveau de la ligne, verrouillage au niveau de la page et verrouillage au niveau de la table. Chaque moteur de stockage MySQL implémente le verrouillage différemment, ce qui vous donne des avantages et des inconvénients distincts. Nous allons d'abord examiner ce qu'est la granularité du verrouillage, puis examiner comment tout fonctionne dans différents moteurs de stockage.
Globalement, les verrous de MySQL entrent dans l'une de ces catégories. Les verrous peuvent être :
-
Au niveau de la page :ces types de granularités de verrouillage étaient disponibles dans les anciens moteurs de MySQL, en particulier BDB, qui est désormais obsolète depuis MySQL 5.1. En bref, BDB était un moteur de stockage inclus dans les anciennes versions de MySQL et c'était un moteur de stockage transactionnel qui effectuait des verrous au niveau de la page. Étant donné que ces types de granularités de verrouillage ne sont plus utilisés, nous n'allons pas les détailler ici, mais en général, ces verrous sont limités aux données et aux index qui résident sur une page particulière. Si vous voulez en savoir plus sur BDB, la page sur MariaDB devrait fournir plus d'informations.
-
Au niveau de la table :MySQL utilise le verrouillage au niveau de la table pour tous les moteurs de stockage, à l'exception d'InnoDB.
-
Le verrouillage au niveau de la ligne est utilisé par InnoDB.
Les avantages et les inconvénients du verrouillage au niveau de la table
MySQL utilise le verrouillage au niveau de la table pour tous les moteurs de stockage sauf InnoDB, ce qui signifie que le verrouillage au niveau de la table est utilisé pour les tables exécutant les moteurs de stockage MyISAM, MEMORY et MERGE, permettant à une seule session de mettre à jour les tables à la fois . Les verrous au niveau de la table présentent certains avantages distincts par rapport aux verrous au niveau de la ligne (par exemple, le verrouillage au niveau de la table nécessite en général un peu moins de mémoire que le verrouillage au niveau de la ligne car le verrouillage au niveau de la ligne nécessite de la mémoire par ligne (ou groupe) de lignes qui sont verrouillés et c'est généralement rapide car un seul verrou est impliqué. Des verrous en écriture de table sont placés sur une table s'il n'y a pas de verrous dessus - s'il y a des verrous préexistants sur la table en question, les demandes de verrou de table sont placées Il convient de mentionner que le verrouillage au niveau de la table présente également des inconvénients distincts qui lui sont propres - par exemple, il peut ne pas convenir très bien aux applications qui nécessitent de nombreuses transactions qui vont et viennent (par exemple, , une application bancaire en ligne) car une seule session peut écrire dans une table à la fois et certaines des tables qui prennent en charge le verrouillage au niveau de la table (comme MyISAM) ne prennent pas en charge le modèle ACID.
Voici un exemple :imaginez une application bancaire qui utilise deux tables dans une base de données - disons que ces tables sont appelées "vérification" et "épargne". Vous devez transférer 100 $ du compte courant d'une personne vers son compte d'épargne. Logiquement, vous effectueriez les étapes suivantes :
-
Assurez-vous que le solde du compte est supérieur à 100 $.
-
Soustraire 100 $ du compte courant.
-
Ajouter 100 $ au compte d'épargne.
Pour effectuer ces actions, vous auriez besoin de quelques requêtes, par exemple :
SELECT balance FROM checking WHERE account_id = 123;
UPDATE checking SET balance = balance - 100 WHERE account_id = 123;
UPDATE savings SET balance = balance + 100 WHERE account_id = 123;
Ces requêtes peuvent sembler simples, mais si vous utilisez MyISAM (nous utilisons MyISAM comme exemple car c'est l'un des principaux moteurs de stockage qui prend en charge les verrous au niveau de la table), vous devez être familiarisé avec le fait que le moteur ne prend pas non plus en charge ACID, ce qui signifie que si le serveur de base de données tombe en panne lors de l'exécution de l'une de ces requêtes, vous n'avez pas de chance :les gens pourraient se retrouver avec de l'argent dans les deux comptes ou dans aucun d'eux. Le seul moteur qui prend en charge les transactions basées sur ACID dans MySQL est InnoDB, donc si vous avez besoin de beaucoup de transactions fiables, cela peut valoir la peine d'y jeter un coup d'œil. InnoDB prend également en charge le verrouillage au niveau des lignes - c'est ce que nous allons examiner maintenant.
Les avantages et les inconvénients du verrouillage au niveau de la ligne
MySQL utilise le verrouillage au niveau des lignes pour les tables InnoDB afin de prendre en charge l'accès simultané en écriture par plusieurs sessions. Certains des avantages de l'utilisation du verrouillage au niveau des lignes incluent la possibilité de verrouiller une seule ligne pendant de longues périodes et moins de conflits de verrouillage lorsque de nombreux threads accèdent à différentes lignes. Cependant, le verrouillage au niveau de la ligne présente également des inconvénients :l'un d'entre eux est que le verrouillage au niveau de la ligne prend généralement plus de mémoire que le verrouillage au niveau de la page ou au niveau de la table, il est également généralement plus lent que les verrous au niveau de la page ou de la table car le moteur doit acquérir plus de verrous. InnoDB est l'un des moteurs qui prend en charge un mécanisme de verrouillage au niveau des lignes :il est également conforme à ACID, ce qui signifie qu'il convient parfaitement aux applications basées sur les transactions (voir l'exemple ci-dessus). Nous allons maintenant examiner le fonctionnement de la granularité des verrous dans l'un des moteurs de stockage MySQL.
Comment fonctionne la granularité du verrouillage dans InnoDB ?
InnoDB est largement connu pour prendre en charge le verrouillage au niveau des lignes, mais il convient également de noter que le moteur prend en charge plusieurs types de verrouillage, ce qui signifie que vous pouvez utiliser des verrous au niveau des lignes et des tables. InnoDB effectue un verrouillage au niveau des lignes en définissant des verrous partagés ou exclusifs sur les enregistrements d'index qu'il rencontre lorsqu'il recherche ou analyse un index de table. Un verrou partagé est un tel verrou qui permet à la transaction qui détient le verrou de lire la ligne en question, un verrou exclusif d'autre part permet à la transaction qui détient le verrou de mettre à jour ou de supprimer une ligne.
InnoDB a également d'autres types de verrous - certains d'entre eux incluent des verrous partagés et exclusifs, des verrous d'intention, des verrous d'enregistrement, des verrous d'espace, des verrous de clé suivante et des verrous d'intention suivante. Les verrous d'intention, par exemple, peuvent également être partagés ou exclusifs - ces verrous indiquent généralement qu'une transaction a l'intention de définir un certain type de verrou (un verrou partagé ou un verrou exclusif) sur des lignes individuelles d'une table, un verrou d'enregistrement est un verrouiller un enregistrement d'index, etc.
En général, la granularité de verrouillage InnoDB diffère de la granularité de verrouillage présente dans d'autres moteurs de stockage MySQL (par exemple, MyISAM) car lorsque le verrouillage au niveau des tables est utilisé, une seule session pour mettre à jour certaines tables à la fois le temps peut courir. Lorsque le verrouillage au niveau des lignes est utilisé, MySQL prend en charge l'accès simultané en écriture sur plusieurs sessions, ce qui fait des moteurs de stockage à verrouillage au niveau des lignes (InnoDB) un choix approprié pour les applications critiques.
Verrouiller la granularité et les interblocages
La granularité du verrouillage et les niveaux de verrouillage dans MySQL peuvent être une bonne chose, mais ils peuvent également causer des problèmes. L'un des problèmes les plus fréquents causés par la granularité des verrous sont les interblocages - un interblocage se produit lorsque différentes transactions MySQL ne peuvent pas continuer parce que chacune d'elles détient un verrou dont l'autre a besoin. Heureusement, lors de l'utilisation du moteur de stockage InnoDB, la détection de blocage est activée par défaut - lorsqu'un blocage est détecté, InnoDB annule automatiquement une transaction. Si vous rencontrez des blocages lors de la gestion de la granularité des verrous dans MySQL, ne vous inquiétez pas - envisagez simplement de redémarrer votre transaction. Afin de surveiller de manière proactive votre base de données, vous devez également envisager d'utiliser les fonctionnalités fournies par ClusterControl.
Comment ClusterControl peut-il vous aider ?
Voici quelques-unes des choses que ClusterControl développée par Manynines peut vous aider :
-
La protection de toutes vos données d'entreprise
-
Si vos données sont corrompues (cela peut être causé par la non-utilisation d'un moteur de stockage compatible ACID ou également par d'autres facteurs comme décrit ci-dessus), l'outil peut exécuter un processus automatique qui vérifie réellement que vous pouvez récupérer vos données.
-
L'outil peut vous indiquer quelles bases de données ne sont pas sauvegardées ou vous montrer l'état de vos sauvegardes (si ils ont réussi ou ils ont échoué)
-
-
L'automatisation de vos opérations de base de données
-
ClusterControl peut vous aider à vous assurer que vos administrateurs système, développeurs et DBA gèrent efficacement des clusters de bases de données entiers avec un minimum de risques en utilisant l'industrie bonnes pratiques
-
-
Gérer efficacement votre infrastructure de base de données en général
-
L'évolution actuelle des technologies combinée à des solutions d'infrastructure sophistiquées nécessite des outils et des connaissances avancés pour atteindre une haute disponibilité et des performances optimales pour vos applications critiques. ClusterControl peut également vous aider dans le déploiement, la surveillance, la gestion et la mise à l'échelle des technologies de base de données open source les plus populaires, notamment MySQL, MariaDB, MongoDB, PostgreSQL, TimeScaleDB et les autres.
-
Pour en savoir plus sur la façon dont ClusterControl peut vous aider à rationaliser vos opérations commerciales, assurez-vous de garder un œil sur le blog de la base de données de Manynines.
Résumé
Différents moteurs de stockage MySQL ont différents types de granularités de verrouillage disponibles. Avant de décider du moteur de stockage que vous devez utiliser, assurez-vous de connaître autant d'informations que possible sur le moteur de stockage en question (par exemple, comme déjà noté, MyISAM doit être évité lorsqu'il s'agit de données critiques car il n'est pas conforme ACID), comprendre toutes les implications de performances connexes, y compris les granularités de verrouillage, les interblocages et le reste et choisissez judicieusement.