Waarom proberen we het niet gewoon?
De database instellen
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');
Start nu twee databaseverbindingen
Verbinding 1
BEGIN;
SELECT * FROM notification WHERE `date` >= '2011-05-03' FOR UPDATE;
Verbinding 2
BEGIN;
Als MySQL alle rijen vergrendelt, blokkeert de volgende instructie. Als het alleen de rijen vergrendelt die het retourneert, zou het niet moeten blokkeren.
SELECT * FROM notification WHERE `date` = '2011-05-02' FOR UPDATE;
En inderdaad, het blokkeert.
Interessant is dat we ook geen records kunnen toevoegen die zouden worden gelezen, d.w.z.
INSERT INTO notification(id, `date`, `text`) values (6, '2011-05-06', 'Notification 6');
blokken ook!
Ik weet op dit moment niet zeker of MySQL gewoon doorgaat en de hele tabel vergrendelt wanneer een bepaald percentage rijen is vergrendeld, of waar het echt intelligent is om ervoor te zorgen dat het resultaat van de SELECT ... FOR UPDATE
query kan nooit worden gewijzigd door een andere transactie (met een INSERT
, UPDATE
, of DELETE
) terwijl het slot wordt vastgehouden.