TableA
+----+------+
| c1 | c2 |+----+------+| 3 | NULL || 4 | NULL || 5 | NULL || 11 | 12 || 12 | 13 |+----+------+一 在c1上无索引,innodb_locks_unsafe_for_binlog开关被关闭。1 1.0 select * from ta where c1=11在read_repatable isolation level的时候,另一个session是可以随便插入的任何值。 1.1 如果是select * from ta where c1=11 lock in share mode它是对所有的行加S lock,另外一个session任何值都是不能插入的。2 update ta set c1=17 where c1=11在read_repatable isolation level的时候,对表中所有行加X行锁,另外一个session不能插入任何值。二 当c1上有索引的时候,非cluster的,非unique的,innodb_locks_unsafe_for_binlog开关被关闭。1 1.0 select * from ta where c1=11在read_repatable isolation level的时候,另一个session是可以随便插入的任何值。 1.1 如果是select * from ta where c1=11 lock in share mode 会对c1=11这一行加S锁,在C1<12上所有的行加上S gap锁, 即另外一个session插入c1>=12是可以的,但是插入c1<12的值不成功。2 update ta set c1=17 where c1=11在在read_repatable isolation level的时候,对表中c1=11这一行加上X锁,对c1<12这个区间插入X gap锁, 另外一个session插入c1>=12是成功的,但是插入c1<12的都是不可以的。三 innodb_locks_unsafe_for_binlog开关被打开,index为clustered和unique的。。等等 分别去实验,好多,不写了。。
一个问题:>select * from tb;+------+------+| c1 | c2 |+------+------+| 3 | NULL || 4 | NULL || 5 | NULL || 6 | 11 || 11 | 12 || 14 | 13 || 15 | 16 || 7 | 10 || 8 | 10 || 9 | 10 |+------+------+>show create table tb;| tb | CREATE TABLE `tb` ( `c1` int(11) DEFAULT NULL, `c2` int(12) DEFAULT NULL, KEY `c1` (`c1`)) ENGINE=InnoDB DEFAULT CHARSET=latin1 |>set autocommit=0;>select * from tb where c1=11;经过验证的结果是:lock monitor显示的加锁: 11加S锁,11的下一条加了S gap锁,实际的操作是: 【11前的一条,11,11后的一条)不能被插入