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 :@:
SELECT qui prend un très long temps.
INSERT sur la même table; ce client va devoir attendre que le premier a fini.
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 :@:
SELECT; comme par exemple, en créant une table sommaire.
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.
INSERT,UPDATE ou DELETE une priorité inférieure avec l'attribut LOW_PRIORITY.
SET SQL_LOW_PRIORITY_UPDATES=1. Reportez vous à la section SET OPTION.
SELECT une priorité supérieure avec l'attribut HIGH_PRIORITY. Reportez vous à la section SELECT.
INSERT et SELECT, l'attribut DELAYED de INSERT pourra vous aider à résoudre votre problème. Reportez vous à la section INSERT.
SELECT et DELETE, l'option LIMIT de DELETE peut être utile. Reportez vous à la section DELETE.