为什么我们不试试呢?
设置数据库
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)进行更改。