10.11 Comment MySQL verrouille les tables

La gestion des verrous sous MySQL est inblocable. Cela est réalisé en demandant toujours tous les droits, en même temps, au début de la requête, et en verrouillant toujours les tables dans le même ordre.

La méthode de verrouillage pour les verrous en écriture (WRITE ) est la suivante :

  • Si il n'y a pas de verrous sur la table, MySQL la verrouille.
  • Sinon, il ajoute une demande de verrous dans la queue d'attente.

La méthode de verrouillage pour les verrous en lecture (READ) est la suivante :

  • Si il n'y a pas de verrous sur la table, MySQL la verrouille.
  • Sinon, il ajoute une demande de verrous dans la queue d'attente.

Quand un verrou est libéré, le verrou est rendu disponible pour les threads de la queue d'attente d'écriture, puis dans la queue d'attente de lecture.

Cela signifie que si vous avez de nombreuses modifications sur une table, les commandes SELECT devront attente qu'il n'ya ait plus de modifications en attente pour être satisfaites.

Pour éviter ce genre de problème, vous pouvez rassembler toutes vos insertions dans une table temporaire, et faire une mise à jour importante de toute la table temporaire dans la fixe, une fois de temps en temps. Cela se réalise avec le code suivant :

mysql> LOCK TABLES real_table WRITE, insert_table WRITE;
mysql> insert into real_table select * from insert_table;
mysql> delete from insert_table;
mysql> UNLOCK TABLES;

Vous pouvez utiliser l'option LOW_PRIORITY ou HIGH_PRIORITY avec INSERT si vous voulez exploiter les priorités. INSERT.

Vous pouvez aussi changer la procédure de verrouillage dans le fichier ``mysys/thr_lock.c'' pour n'utiliser qu'une seule queue d'attente. Danx ce cas, les verrous d'écriture et de lecture auront les mêmes priorités, ce qui peut être utile dans certains cas.