Защо просто не опитаме?
Настройте базата данни
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');
Сега стартирайте две връзки към базата данни
Връзка 1
BEGIN;
SELECT * FROM notification WHERE `date` >= '2011-05-03' FOR UPDATE;
Връзка 2
BEGIN;
Ако MySQL заключи всички редове, следният оператор ще блокира. Ако заключва само връщаните редове, не трябва да блокира.
SELECT * FROM notification WHERE `date` = '2011-05-02' FOR UPDATE;
И наистина блокира.
Интересното е, че също не можем да добавяме записи, които биха били прочетени, т.е.
INSERT INTO notification(id, `date`, `text`) values (6, '2011-05-06', 'Notification 6');
блокове също!
В този момент не мога да бъда сигурен дали MySQL просто продължава и заключва цялата таблица, когато определен процент от редовете са заключени, или къде всъщност е наистина интелигентен, за да се увери, че резултатът от SELECT ... FOR UPDATE
заявката никога не може да бъде променена от друга транзакция (с INSERT
, UPDATE
или DELETE
), докато заключването се държи.