Mysql
 sql >> Base de données >  >> RDS >> Mysql

Lors de l'utilisation du verrouillage FOR UPDATE de MySQL, qu'est-ce qui est exactement verrouillé ?

Pourquoi ne pas simplement essayer ?

Configurer la base de données

CREATE DATABASE so1;
USE so1;
CREATE TABLE notification (`id` BIGINT(20), `date` DATE, `text` TEXT) ENGINE=InnoDB;
INSERT INTO notification(id, `date`, `text`) values (1, '2011-05-01', 'Notification 1');
INSERT INTO notification(id, `date`, `text`) values (2, '2011-05-02', 'Notification 2');
INSERT INTO notification(id, `date`, `text`) values (3, '2011-05-03', 'Notification 3');
INSERT INTO notification(id, `date`, `text`) values (4, '2011-05-04', 'Notification 4');
INSERT INTO notification(id, `date`, `text`) values (5, '2011-05-05', 'Notification 5');

Maintenant, démarrez deux connexions à la base de données

Connexion 1

BEGIN;
SELECT * FROM notification WHERE `date` >= '2011-05-03' FOR UPDATE;

Connexion 2

BEGIN;

Si MySQL verrouille toutes les lignes, l'instruction suivante bloquera. S'il ne verrouille que les lignes qu'il renvoie, il ne devrait pas bloquer.

SELECT * FROM notification WHERE `date` = '2011-05-02' FOR UPDATE;

Et effectivement ça bloque.

Fait intéressant, nous ne pouvons pas non plus ajouter d'enregistrements qui seraient lus, c'est-à-dire

INSERT INTO notification(id, `date`, `text`) values (6, '2011-05-06', 'Notification 6');

bloque également !

Je ne peux pas être sûr à ce stade si MySQL va juste de l'avant et verrouille toute la table lorsqu'un certain pourcentage de lignes est verrouillé, ou s'il est en fait vraiment intelligent de s'assurer que le résultat de la SELECT ... FOR UPDATE la requête ne peut jamais être modifiée par une autre transaction (avec un INSERT , UPDATE , ou DELETE ) pendant que le verrou est maintenu.