mysql间隙锁怎么样 mysql区间锁

深入理解MySQL的间隙锁

因为行锁只能锁住行,但是新插入记录这个动作,要更新的是记录之间的“间隙”。为了解决幻读问题,InnoDB 只好引入新的锁,也就是间隙锁 (Gap Lock)。

我们注重客户提出的每个要求,我们充分考虑每一个细节,我们积极的做好网站建设、成都网站制作服务,我们努力开拓更好的视野,通过不懈的努力,成都创新互联赢得了业内的良好声誉,这一切,也不断的激励着我们更好的服务客户。 主要业务:网站建设,网站制作,网站设计,微信小程序开发,网站开发,技术开发实力,DIV+CSS,PHP及ASP,ASP.Net,SQL数据库的技术开发工程师。

间隙锁,锁的就是两个值之间的空隙,不允许两个值之间再插一个值。

比如初始化插入了 6 个记录,这就产生了 7 个间隙。分别是 (-∞,0)、(0,5)、(5,10)、(10,15)、(15,20)、(20, 25)、(25, +supremum),间隙锁都是开区间

和行锁不一样的是,跟间隙锁存在冲突关系的,是“往这个间隙中插入一个记录”这个操作。间隙锁之间都不存在冲突关系。

缺点:可能会导致同样的语句锁住更大的范围,影响了并发度。

间隙锁和行锁合称 next-key lock,每个 next-key lock 是前开后闭区间。如果用 select * from t for update 要把整个表所有记录锁起来,就形成了 7 个 next-key lock,分别是 (-∞,0]、(0,5]、(5,10]、(10,15]、(15,20]、(20, 25]、(25, +supremum]。

和间隙锁的最大区别是,next-key lock 为前开后闭区间,这样所有的next-key lock就可以把所有记录锁起来。

加锁规则里面,包含了两个“原则”、两个“优化”和一个“bug”

mysql 的锁以及间隙锁

mysql 为并发事务同时对一条记录进行读写时,提出了两种解决方案:

1)使用 mvcc 的方法,实现多事务的并发读写,但是这种读只是“快照读”,一般读的是历史版本数据,还有一种是“当前读”,一般加锁实现“当前读”,或者 insert、update、delete 也是当前读。

2)使用加锁的方法,锁分为共享锁(读锁),排他锁(写锁)

快照读:就是select

当前读:特殊的读操作,插入/更新/删除操作,属于当前读,处理的都是当前的数据,需要加锁。

mysql 在 RR 级别怎么处理幻读的呢?一般来说,RR 级别通过 mvcc 机制,保证读到低于后面事务的数据。但是 select for update 不会触发 mvcc,它是当前读。如果后面事务插入数据并提交,那么在 RR 级别就会读到插入的数据。所以,mysql 使用 行锁 + gap 锁(简称 next-key 锁)来防止当前读的时候插入。

Gap Lock在InnoDB的唯一作用就是防止其他事务的插入操作,以此防止幻读的发生。

Innodb自动使用间隙锁的条件:

mysql 间隙锁和临键锁原理

以下面的表为例子进行说明

间隙锁的产生来自于 InnboDB 引擎在可重复读的级别基础上执行当前读时出现的幻读问题。下面来分析一下幻读的例子, 假如没有间隙锁的话 ,那么会出现下面的现象:

如上表如示,是基于没有间隙锁的假设,sessionA 事务内执行两次相同的当前读返回的数据不一样,出现幻读的现象。因为(2,2,10)这条记录在原本的数据并不存在,行锁就锁不住,因此诞生间隙锁。

首先看看sessionA的执行计划,发现用到覆盖索引

场景 1:插入到索引 a 时,要插入是索引是(11,5),属于(a=10,id=10)和(a=30,id=30)之间的锁范围,所以阻塞

场景 2、3、4 同理分析得出结论

本例子跟《查询条件走二级索引例子》区别在于 sessionA 是 select * ,因此需要回到主键索引查询所有字段,扫描了主键索引,所以也会在扫描到的索引进行加 next-key lock。该语句回表一次,扫描到是行是 id=10,所以加锁是(0,10],(10,20),因此 sessionA 一共加了锁是索引 a 的(10,30)和主键索引的(0,20)。

什么是间隙锁?

间隙锁是可重复读级别下才会有的锁,结合MVCC和间隙锁可以解决幻读的问题。我们还是以user举例,假设现在user表有⼏条记录

当我们执⾏:

只有10可以插⼊成功,那么因为表的间隙mysql⾃动帮我们⽣成了区间(左开右闭)

由于20存在记录,所以(10,20],(20,30]区间都被锁定了⽆法插⼊、删除。

如果查询21呢?就会根据21定位到(20,30)的区间(都是开区间)。

需要注意的是唯⼀索引是不会有间隙索引的。


本文名称:mysql间隙锁怎么样 mysql区间锁
文章转载:http://scyanting.com/article/ddgdeej.html