您的位置:首页 > 博客中心 > 数据库 >

innodb 间隙锁

时间:2022-03-14 13:42

innodb 间隙锁, 参考 

针对于辅助索引,也称范围索引

间隙锁只会出现在辅助索引上,唯一索引和主键索引是没有间隙锁。间隙锁(无论是S还是X)只会阻塞insert操作

 但不清楚什么时候会用 共享锁

CREATE TABLE tb1 (
  id int(11) NOT NULL,
  id2 int(11) NOT NULL,
  PRIMARY KEY (id),
  KEY idx (id2)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into tb1 values(1, 2), (2, 1), (3, 8);

 

tb1表现在有3条记录,其中普通索引字段id2的值3、6、9

把间隙分成了四份:(-,1)、(1、2)、(2、8)、(8、+)。

现在我们看看基于id2 = 6加锁的情况,会话S1中对id2 = 2的记录加S锁

会话1

技术分享

 

会话2, 7正好在(2,8)范围内 由于会话1中 间隙锁存在,被锁住了

技术分享

 

但插入 9 就没有问题,在 (8,+)范围外

技术分享

 

间隙锁在InnoDB的唯一作用就是防止其它事务的插入操作,以此来达到防止幻读的发生,

所以间隙锁不分什么共享锁与排它锁。

另外,在上面的例子中,我们选择的是一个普通(非唯一)索引字段来测试的,

这不是随便选的,因为如果InnoDB扫描的是一个主键、或是一个唯一索引的话,那InnoDB只会采用行锁方式来加锁,而不会使用Next-Key Lock的方式,也就是说不会对索引之间的间隙加锁

 

要禁止间隙锁的话,可以把隔离级别降为读已提交,或者开启参数innodb_locks_unsafe_for_binlog。

 

本类排行

今日推荐

热门手游