《三》行锁-表锁-间隙锁


在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;
    
posted on 2024-09-08 13:47  stone_mll  阅读(5)  评论(0编辑  收藏  举报