Почему бы нам просто не попробовать?
Настроить базу данных
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;
И действительно, он блокирует.
Интересно, что мы также не можем добавлять записи, которые будут прочитаны, т.е.1025 *
INSERT INTO notification(id, `date`, `text`) values (6, '2011-05-06', 'Notification 6');
блоков также!
На данный момент я не могу быть уверен, что MySQL просто работает и блокирует всю таблицу, когда определенный процент строк заблокирован, или где он на самом деледействительно умный, чтобы убедиться, что результат запроса SELECT ... FOR UPDATE
никогда не может быть изменен другой транзакцией (с INSERT
, UPDATE
или DELETE
), пока удерживается блокировка.