Utilitaires
Scripts
Divers
Jeux
Rechercher
Quillevere.net
Réflexions informatiques

Les verrous (lock)

02/08/2014

De façon générale, sur MySQL (et avec InnoDB), les verrous sont posés lors des opérations de mises à jour (UPDATE, DELETE et SELECT FOR UPDATE).

Il y a des verrous au niveau table et des verrous au niveau ligne (row-locket table-block),. Les premiers peuvent être posés par la commande "LOCK matable" tandis que les verrous au niveau enregistrement sont automatiquement posés et levés par MySQL, selon les requêtes. Il est intéressant de savoir quelques petites choses sur ces verrous par ligne, afin d'éviter d'en poser inutilement (et donc de ralentir les autres transactions).

Si l'on prend le cas d'une table matable, ayant 2 champs, l'un en clé primaire (id) et l'autre non indexé (valeur).

Cas 1 :
DELETE FROM matable WHERE id=1
ne bloquera que la ligne 1 car MySQL utilisera l'index (même chose si l'on utilise le IN).

 
Cas 2 :
DELETE FROM matable WHERE champ="a"
bloquera toutes les lignes car MySQL posera un verrou sur toutes les lignes analysées.

Cas 3 :
DELETE FROM matable WHERE id=(SELECT id FROM (SELECT id FROM matable WHERE id=1))
bloquera toutes les lignes car le premier DELETE utilise l'index, le 2ème SELECT aussi mais pas celui intermédiaire, qui scanne tous les champs de la table et bloquera intégralement celle-ci le temps de la transaction.

Une bonne solution pour faire une mise à jour sur une table avec celle-ci en sous-requête est de faire une jointure comme ceci :
DELETE matable FROM matable JOIN
(SELECT id FROM (SELECT id FROM matable WHERE id=1) AS tmp1) AS tmp2
ON tmp2.id=matable.id;
Dernière modification le 08/03/2019 - Quillevere.net

Rechercher sur le site

rss RSS info Informations