- 1 1. Introduction
- 2 2. Concepts de base des verrous MySQL
- 3 2.2 Exemples d’occurrence de verrous
- 4 3. Vérification de l’état de verrouillage MySQL (par version)
- 5 4. Comment libérer les verrous dans MySQL (Avec explication des risques)
- 6 5. Points clés et meilleures pratiques pour les verrous MySQL
- 7 6. Résumé
- 8 7. FAQ
- 8.1 Q1. Quelle est la façon la plus simple de vérifier l’état des verrous MySQL ?
- 8.2 Q2. Comment dois-je gérer les blocages ?
- 8.3 Q3. La commande KILL peut-elle corrompre les données ?
- 8.4 Q4. Comment puis‑je empêcher les blocages ?
- 8.5 Q5. Comment puis‑je améliorer les performances de MySQL en réduisant les verrous ?
1. Introduction
MySQL est largement utilisé comme système de gestion de base de données, mais lorsqu’un nombre important de requêtes accède aux mêmes données, un mécanisme de verrouillage est déclenché. Les verrous sont essentiels pour maintenir la cohérence des données, mais une mauvaise gestion peut entraîner des blocages (deadlocks) et une dégradation des performances.
Cet article explique les concepts fondamentaux des verrous dans MySQL, détaillant comment vérifier l’état des verrous, libérer les verrous et prévenir les blocages.
Ce que vous apprendrez
- Types de verrous MySQL et leurs effets
- Méthodes spécifiques à chaque version pour vérifier les verrous
- Procédures sûres pour libérer les verrous
- Stratégies pratiques pour prévenir les blocages
Commençons par le concept de base des verrous MySQL.
2. Concepts de base des verrous MySQL
Dans les bases de données, un « verrou » est un mécanisme qui restreint l’accès pour maintenir l’intégrité des données lorsque plusieurs transactions tentent de modifier les données simultanément. Une mauvaise gestion des verrous peut entraîner des problèmes de performance ou des blocages.
2.1 Types principaux de verrous
MySQL propose plusieurs types de verrous en fonction du niveau de protection des données requis.
Verrou de ligne
- Verrouille uniquement des lignes spécifiques, minimisant l’impact sur les autres transactions.
- Soutenu uniquement par le moteur InnoDB.
- Se produit lors de l’utilisation de
SELECT ... FOR UPDATEouSELECT ... LOCK IN SHARE MODE.
Verrou de table
- Verrouille l’ensemble de la table, empêchant plusieurs requêtes de s’exécuter simultanément.
- Couramment utilisé par le moteur MyISAM.
- Déclenché par la déclaration
LOCK TABLES.
Verrou d’intention
- Coordonne les verrous de lignes et de tables pour éviter les conflits.
- Utilisé uniquement dans InnoDB et géré automatiquement.
Blocage
- Se produit lorsqu’un nombre multiple de transactions attendent les verrous l’une de l’autre indéfiniment.
- Une conception de transaction inappropriée peut faire interrompre le processus.
2.2 Exemples d’occurrence de verrous
Les exemples suivants montrent comment les verrous se produisent dans des requêtes SQL réelles.
Exemple de verrou de ligne
L’exécution de la requête SQL ci-dessous verrouille des lignes spécifiques.
BEGIN; UPDATE products SET stock = stock – 1 WHERE product_id = 100; — Other sessions cannot update this row until COMMIT or ROLLBACK is executed
Si une autre session tente de mettre à jour la même ligne, elle entrera dans un état d’attente (conflit de verrou).
Exemple de verrou de table
Pour verrouiller une table entière, utilisez la commande suivante :
LOCK TABLES products WRITE; — Prevents other sessions from modifying the products table until the lock is released
Jusqu’à ce que ce verrou soit libéré, aucun autre utilisateur ne pourra modifier les données de la table products.
Exemple de blocage
Un scénario typique de blocage ressemble à ceci :
— Session 1 BEGIN; UPDATE orders SET status = ‘shipped’ WHERE order_id = 1; — Waiting for Session 2…
— Session 2 BEGIN; UPDATE customers SET last_order = NOW() WHERE customer_id = 10; — Waiting for Session 1…
— Session 1 (executes next) UPDATE customers SET last_order = NOW() WHERE customer_id = 10; — Deadlock occurs here
Dans ce cas, chaque transaction attend que l’autre libère un verrou, entraînant un blocage.

3. Vérification de l’état de verrouillage MySQL (par version)
Pour déterminer si des verrous sont actifs, utilisez les commandes appropriées pour votre version MySQL.
3.1 MySQL 5.6 et versions antérieures
Dans MySQL 5.6 et versions antérieures, utilisez SHOW ENGINE INNODB STATUSG; pour vérifier les détails des verrous.
SHOW ENGINE INNODB STATUSG;
Cette commande affiche des informations détaillées sur les verrous actuels.
3.2 MySQL 5.7
À partir de MySQL 5.7, il est plus simple d’utiliser la table sys.innodb_lock_waits.
SELECT * FROM sys.innodb_lock_waits;
Cette requête indique quelles transactions attendent actuellement des verrous.
3.3 MySQL 8.0 et versions ultérieures
Dans MySQL 8.0 et versions ultérieures, vous pouvez obtenir des informations plus détaillées en utilisant performance_schema.data_locks.
SELECT * FROM performance_schema.data_locks;
Pour identifier quelle session détient le verrou :
SELECT * FROM performance_schema.threads WHERE PROCESSLIST_ID =
Cela permet de repérer le processus responsable du verrou.
4. Comment libérer les verrous dans MySQL (Avec explication des risques)
Si un verrou se produit dans MySQL et n’est pas libéré correctement, il peut bloquer les processus et réduire les performances de la base de données.
Cette section explique comment libérer les verrous en toute sécurité et les risques potentiels associés.
4.1 Identifier les sessions tenant des verrous
Avant de libérer un verrou, identifiez quelle session le tient. Utilisez la requête SQL suivante pour vérifier les sessions en attente de verrous :
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE='Waiting for table metadata lock';
Cette requête répertorie les sessions qui attendent actuellement des verrous de métadonnées de tables.
Dans MySQL 8.0 et versions ultérieures, vous pouvez obtenir des données de verrouillage détaillées avec :
SELECT * FROM performance_schema.data_locks;
4.2 Libérer les verrous avec la commande KILL
Une fois que vous avez identifié la session tenant un verrou, vous pouvez terminer le processus pour le libérer.
1. Vérifier les processus tenant des verrous
SELECT ID, USER, HOST, DB, COMMAND, TIME, STATE, INFO FROM INFORMATION_SCHEMA.PROCESSLIST;
2. Terminer la session à l’aide de la commande KILL
KILL <process_id>;
Exemple : Pour terminer le processus ID=12345, exécutez :
KILL 12345;
⚠️ Risques liés à l’utilisation de KILL
- Les transactions terminées feront un ROLLBACK automatiquement
- Par exemple, les opérations
UPDATEnon terminées peuvent faire perdre les modifications en attente. - Peut provoquer des erreurs applicatives
- Si des opérations
KILLfréquentes sont nécessaires, revérifiez la conception transactionnelle de votre application.
4.3 Libérer les verrous en toute sécurité avec ROLLBACK
Avant d’utiliser KILL, essayez de terminer la transaction manuellement lorsqu’il est possible.
1. Vérifier les sessions en cours
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
2. Identifier la transaction problématique et exécuter ROLLBACK
ROLLBACK;
Cette méthode libère les verrous en toute sécurité tout en maintenant la cohérence des données.
4.4 Automatiser la libération des verrous avec SET innodb_lock_wait_timeout
Au lieu de libérer les verrous manuellement, vous pouvez configurer un délai d’attente afin que les verrous expirent automatiquement après une certaine période.
SET innodb_lock_wait_timeout = 10;
Ce paramètre provoque l’annulation automatique d’une transaction si un verrou n’est pas libéré dans les 10 secondes, empêchant ainsi les blocages prolongés.
5. Points clés et meilleures pratiques pour les verrous MySQL
Une gestion correcte des verrous minimise les deadlocks et la dégradation des performances. Voici les meilleures pratiques pour une gestion efficace des verrous.
5.1 Prévenir les deadlocks
Pour éviter les deadlocks, suivez ces principes :
1. Maintenir un ordre de transaction cohérent
- Mettez toujours à jour plusieurs tables dans la même séquence.
- Exemple :
-- OK: Always update orders → customers
BEGIN;
UPDATE orders SET status = 'shipped' WHERE order_id = 1;
UPDATE customers SET last_order = NOW() WHERE customer_id = 10;
COMMIT;
× Mauvais : Un ordre incohérent provoque des deadlocks
-- Session 1
BEGIN;
UPDATE customers SET last_order = NOW() WHERE customer_id = 10;
UPDATE orders SET status = 'shipped' WHERE order_id = 1;
COMMIT;
-- Session 2 (executed in reverse order → possible deadlock)
BEGIN;
UPDATE orders SET status = 'shipped' WHERE order_id = 1;
UPDATE customers SET last_order = NOW() WHERE customer_id = 10;
COMMIT;
2. Rendre les transactions courtes
- Toujours COMMIT ou ROLLBACK rapidement
- Les transactions longues bloquent d’autres sessions et augmentent le risque de deadlock.
3. Utiliser un index approprié
- Les index réduisent la portée des lignes verrouillées, minimisant les verrous inutiles.
- Exemple : ajouter un index sur
customer_iddans la tableordersgarantit que seules les lignes pertinentes sont verrouillées.
CREATE INDEX idx_customer_id ON orders (customer_id);
6. Résumé
- Les verrous MySQL comprennent des verrous de ligne, de table et d’intention . Une mauvaise gestion peut entraîner des blocages et ralentir les performances.
- Les méthodes de vérification des verrous diffèrent entre les versions MySQL .
- Soyez prudent lors de la libération des verrous !
- Essayez
ROLLBACKavant d’utiliserKILL. - Utilisez
SET innodb_lock_wait_timeoutpour automatiser la libération des verrous. - Évitez les blocages en maintenant l’ordre des transactions cohérent et en réduisant le temps des transactions .
7. FAQ
Q1. Quelle est la façon la plus simple de vérifier l’état des verrous MySQL ?
- A1. Sous MySQL 8.0+, utilisez
SELECT * FROM performance_schema.data_locks;pour afficher facilement l’état des verrous.
Q2. Comment dois-je gérer les blocages ?
- A2. Exécutez
SHOW ENGINE INNODB STATUS;pour identifier la cause, puis ajustez l’ordre des transactions pour éviter les récurrences.
Q3. La commande KILL peut-elle corrompre les données ?
- A3. La terminaison forcée déclenche
ROLLBACKpour les transactions non terminées, ce qui peut affecter la cohérence. Utilisez‑la avec précaution.
Q4. Comment puis‑je empêcher les blocages ?
- A4. Appliquez ces règles :
- Maintenez l’ordre des transactions cohérent
- Utilisez des transactions courtes
- Définissez des index appropriés
Q5. Comment puis‑je améliorer les performances de MySQL en réduisant les verrous ?
- A5.
- Concevez des index efficaces pour minimiser les verrous
- Utilisez des transactions courtes pour réduire le temps de verrouillage
- Évitez les verrous complets de table (LOCK TABLES)
- Profitez des réplicas de lecture pour répartir la charge de lecture


