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);
update t set d=5 where id=0; /*(0,0,5)*/ update t set c=5 where id=0; /*(0,5,5)*/ insert into t values(1,1,5); /*(1,1,5)*/ update t set c=5 where id=1; /*(1,5,5)*/ update t set d=100 where d=5;/* 全部 d=5 的行,d 改爲 100*/
select * from t where d = 5 for update;
這裏因爲表中沒有c=7這條記錄,而且 c是索引字段,因此SessionA會在(5,10)這個間隙上加鎖。而SessionB也是在這個間隙進行加鎖,這兩個鎖的目的都是爲了保護這個間隙不被插入數據,因此他們之間是不衝突的。javascript
例如:java