当前位置:Gxlcms > 数据库问题 > innodb 间隙锁

innodb 间隙锁

时间:2021-07-01 10:21:17 帮助过:2人阅读

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。

 

innodb 间隙锁

标签:

人气教程排行