《三》行锁-表锁-间隙锁
在RR级别下,for update,lock in share mode默认加的锁时next-key 锁
一、行锁
- 当select语句走的是主键索引时,next-key变更为行锁
二、表锁
- 当select语句没有走索引时,为表锁
三、间隙锁
-
当select语句走的是普通索引,包括唯一索引时为间隙锁
CREATE TABLE `tree` ( `id` bigint NOT NULL AUTO_INCREMENT, `parentid` bigint DEFAULT NULL, `name` varchar(50) DEFAULT NULL, `type` varchar(20) DEFAULT NULL COMMENT '事业单位,学校,其它', `persionid` bigint DEFAULT NULL, `sort` int DEFAULT NULL, `tm` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; # 添加索引 parentid_index parentid UNIQUE 0 A 4 0
begin; -- 主键索引 next-key lock会退化为行锁,能正常插入id为4的记录 -- select * from tree where id in (3, 8) for update ; -- 普通索引/唯一索引的next-key lock不会退化,锁住parentid在(左开区间最靠近3的值,右开区间最靠近8的值)区间的记录 -- select * from tree where parentid in (3, 8) for update ; -- [3, 正无穷), 大于8的值没有则正无穷 -- select * from tree where parentid>3 and parentid<8 for update ; commit;