首先给出要用到的数据:
CREATE TABLE `t` ( `id` int(11) NOT NULL, `c` int(11) DEFAULT NULL, `d` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `c` (`c`) ) ENGINE=InnoDB; insert into t values(0,0,0),(5,5,5), (10,10,10),(15,15,15),(20,20,20),(25,25,25);
那么下面的语句,是怎么加锁的,加的锁又是什么时候释放的?
begin; select * from t where d=5 for update; commit;
该语句会命中d=5的行,对应的主键id=5,因此在select语句执行完成后,id=5这一行会加一个写锁,且由于两阶段锁协议,该写锁会在执行commit语句时候释放。
由于字段d上没有索引,该语句会做全表扫描,那么其他被扫描到但不符合条件的记录是否会被加锁呢?
本文接下来没有特殊说明的,都是设定在可重复读隔离级别。
幻读是什么?
先看如果只在id=5的行加锁会怎么样。
假设有这样一个场景:
