10.13 Problèmes liés au verrouillage

Le système de verrouillage des tables de MySQL empêche les blocages.

MySQL utilise le verrouillage de table pour réaliser des verrous à très haute vitesse. Cela remplace avantageusement le verrouillage de colonne ou de ligne. Pour les grandes tables, le verrouillage est BEAUCOUP plus rapide que le verrouillage de ligne. Cependant, il y a quelques limitations.

Le verrouillage de table permet à plusieurs threads de lire une table en même temps, mais limite l'écriture de cette table à un seul thread, qui doit s'assurer de l'accès exclusif à la table. Durant la modification, les autres threads devront attendre.

Etant donné que les modifications sont considérés comme plus importantes que les SELECT, toutes les commandes de modifications ont une priorité supérieure aux commandes de selections. Cela permet de ne pas bloquer les modifications si une table est sujette à un fort trafic en lecture.

Le problème principal avec ceci est décrit avec la situation suivante :

  • Un client émet une requête SELECT qui prend un très long temps.
  • Un autre client émet une requête INSERT sur la même table; ce client va devoir attendre que le premier a fini.
  • Un autre client émet une autre requête SELECT sur la même table; Comme INSERT a la priorité sur SELECT, ce SELECT va attendre que INSERT soit fini. Il va aussi attendre que le premier SELECT soit fini !

Les solutions envisageables sont :

  • Essayer d'accélérer la commande SELECT; comme par exemple, en créant une table sommaire.
  • Démarrer mysqld avec --low-priority-inserts. Cela va donner aux commandes de sélection la priorité sur les commandes d'insertion. Dans ce cas, la dernière requête SELECT du scénario passera en priorité sur la commande d'insertion.
  • Vous pouvez donnez spécifiquement à une commande INSERT,UPDATE ou DELETE une priorité inférieure avec l'attribut LOW_PRIORITY.
  • Vous pouvez spécifiez que toutes les modifications d'un thread donnée auront une priorité basse, en utilisant la commande SQL : : SET SQL_LOW_PRIORITY_UPDATES=1. Reportez vous à la section SET OPTION.
  • Vous pouvez donnez spécifiquement à une commande SELECT une priorité supérieure avec l'attribut HIGH_PRIORITY. Reportez vous à la section SELECT.
  • Si vous utilisez fréquemment des commandes INSERT et SELECT, l'attribut DELAYED de INSERT pourra vous aider à résoudre votre problème. Reportez vous à la section INSERT.
  • Si vous avez des problèmes avec SELECT et DELETE, l'option LIMIT de DELETE peut être utile. Reportez vous à la section DELETE.