Services webmasters
Partenaires
Jeux concours gratuits
 
Optimisation de MySQL
<<<
Comment MySQL verrouille les tables Problème de verrouillage de tables
>>>

5.3 Verrouillage de tables
5 Optimisation de MySQL
 Manuel de Référence MySQL 4.1 : Version Française

->Comment MySQL verrouille les tables
Problème de verrouillage de tables

5.3.1 Comment MySQL verrouille les tables

Vous pouvez trouver une discussion sur les différentes méthodes de verrouillage dans l'annexe. Méthodes de verrouillage .

Toutes les méthodes de verrouillage de MySQL sont exemptes de blocage, sauf pour les tables InnoDB et BDB . Ceci fonctionne en demandant tous les verrous d'un seul coup, au début de la requête, et en verrouillant les tables toujours dans le même ordre.

Les tables InnoDB obtiennent automatiquement leur verrou de ligne et les tables BDB leur verrou de page, durant le traitement de la requête SQL, et non pas au démarrage de la transaction.

La méthode de verrouillage des tables de MySQL en écriture ( WRITE ) fonctionne comme ceci :

  • Si il n'y a pas de verrou sur la table, pose un verrou en écriture dessus.
  • Sinon, soumet une requête de verrouillage dans la queue de verrous d'écriture.
La méthode de verrouillage des tables de MySQL en lecture ( READ ) fonctionne comme ceci :
  • Si il n'y a pas de verrou sur la table, pose un verrou en écriture dessus.
  • Sinon, soumet une requête de verrouillage dans la queue de verrou de lecture.
Lorsqu'un verrou est libéré, le verrou est donné aux threads de la queue de verrou en écriture, puis à ceux de la queue de verrou en lecture.Cela signifie que si vous avez de nombreuses modifications dans une table, la commande SELECT va attendre qu'il n'y ait plus d'écriture avant de lire.

Pour contourner ce problème dans les cas où vous voulez faire de nombreuses INSERT et SELECT sur la même table, vous pouvez insérer les lignes dans une table temporaire, et ne modifier la table réelle que de temps en temps, à partir de la table temporaire.

Ceci peut être fait comme ceci :

mysql> LOCK TABLES real_table WRITE, insert_table WRITE;
mysql> INSERT INTO real_table SELECT * FROM insert_table;
mysql> TRUNCATE TABLE insert_table;
mysql> UNLOCK TABLES;
Vous pouvez aussi utiliser les options LOW_PRIORITY de INSERT , UPDATE ou DELETE ou HIGH_PRIORITY avec SELECT si vous voulez donner d'autres prioritées aux actions. Vous pouvez aussi démarrer mysqld avec l'option --low-priority-updates pour obtenir ce type de comportement.

Utiliser l'option SQL_BUFFER_RESULT peut aussi réduire la durée des verrous de tables. Syntaxe des SELECT .

Vous pouvez aussi changer le code de verrouillage dans le fichier mysys/thr_lock.c , pour utiliser une queue simple. Dans ce cas, les verrous en écriture et en lecture auront la même priorité, ce qui peut aider certaines applications.

<< Comment MySQL verrouille les tables >>
Optimisation de MySQL Verrouillage de tables Problème de verrouillage de tables
Services webmasters
Les manuels
 
CoursPHP.com - Reproduction interdite -