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.
|