La gestion des verrous dans le moteur InnoDB
Je viens d’achever une formation de 3 jours relative à l’administration d’une base de données MySQL pour des salariés du CNRS. Pour la 1ère formation de l’année, je dois dire que j’ai passé 3 excellentes journées en compagnie de Vincent, Pascal, Jean, Armand, Rémy, Yonathan et Sana.
Lorsque nous avons abordé la question des verrous vendredi après-midi, j’ai mis en évidence une gestion de verrous extrêmement archaïque, aux antipodes de celle proposée dans Oracle Database ou dans PostgreSQL.
Pas de verrous concurrents sur lignes
Au niveau de la motorisation InnoDB, lorsque vous faites un UPDATE ou un DELETE sur lignes dans le cadre d’une transaction ouverte par un BEGIN ou un START TRANSACTION, vous posez un verrou exclusif sur la table, interdisant la modification d’autres lignes. C’est une énorme limitation au niveau du moteur InnoDB – acquis par Oracle en 2005 – par rapport à ses concurrents.
Il serait temps, grand temps que MariaDB se mette à niveau et nous propose une solution pleinement « professionnelle ». Concernant TokuDB, il fonctionne exactement de la même manière qu’InnoDB en ce qui concerne la gestion des verrous.
Visualiser les verrous bloquants dans MySQL
Vous disposez d’une vue sous MySQL vous permettant de visualiser les verrous bloquants :
SELECT * FROM sys.innodb_lock_waits;
Libérer les utilisateurs
Afin de libérer les utilisateurs en attente, il convient alors de « tuer » la transaction en récupérant l’id du process bloquant fourni par la requête précédente, à l’aide de l’instruction KILL :
KILL [CONNECTION | QUERY] processlist_id