当记录为
10
20
30
当添加一个(10,20)的间隙锁时,如果将20记录删除,则会给拥有间隙锁的所有事务在添加一个 20到30的间隙锁
当添加一个(20,30)的间隙锁时,如果将20记录删除,则会给拥有间隙锁的所有事务在添加一个 10到20的间隙锁,原先的锁继承他。相当于升级了 就是锁间隙
#define LOCK_WAIT 256 /* 表示正在等待锁 */
#define LOCK_ORDINARY 0 /* 表示 next-key lock ,锁住记录本身和记录之前的 gap*/
#define LOCK_GAP 512 /* 表示锁住记录之前 gap(不锁记录本身) */
#define LOCK_REC_NOT_GAP 1024 /* 表示锁住记录本身,不锁记录前面的 gap */
#define LOCK_INSERT_INTENTION 2048 /* 插入意向锁 */
#define LOCK_CONV_BY_OTHER 4096 /* 表示锁是由其它事务创建的(比如隐式锁转换) */
行锁单位 是 next-key-lock
只有当唯一索引等值查询时(where 条件后面的 唯一键 = ‘’) 才会退化为 记录锁
现在只想到两种情况 select * from where 和 update tab set where
(测试过:in 也算作等值查询,会退化为记录锁,但是 between and 和 > < 不会退化,还是临键锁)
insert into 出现 唯一键冲突时加的S 锁 不会退化,还是 next-key-lock 所以下面会死锁。
当 insert into duplicate key on update
遇到唯一键重复时,会在记录上添加 临键锁 next-key-lock (s mode) 注意是 共享锁