简单了解 MySQL 中相关的锁 (3)

(30, ∞)

InnoDB 的默认事务隔离级别为可重复读(RR),在这个情况下,InnoDB 就会使用临键锁,以防止幻读的出现。

简单解释一下幻读,就是在事务内,你执行了两次查询,第一次查询出来 5 条数据,但是第二次再查,居然查出了 7 条数据,这就是幻读

可能你在之前的很多博客,或者面试八股文上,了解到过 InnoDB 的RR事务隔离级别可以防止幻读,RR防止幻读的关键就是临键锁

举个例子,假设 student 表中就两行数据,id分别为90和110.

SELECT * FROM student WHERE id > 100 FOR UPDATE;

当执行该 SQL 语句之后,InnoDB就会给区间 (90, 110] 和(110,∞) 加上间隙锁,同时给 id=110 的索引加上记录锁。这样以来,其他事务就无法向这个区间内新增数据,即使 100 根本不存在。

插入意向锁

接下来是插入意向锁(Insert Intention Locks),当我们执行 INSERT 语句之前会加的锁。本质上是间隙锁的一种。

还是举个例子,假设我们现在有索引记录10、20,事务A、B分别插入索引值为14、16的数据,此时事务A和B都会用插入意向锁锁住 10-20 之间的 Gap,获取了插入意向锁之后就会获取14、16的排他锁。

此时事务A和B是不会相互阻塞的,因为他们插入的是不同的行。

自增锁

最后是自增锁(AUTO-INC Locks),自增锁的本质是表锁,较为特殊。当事务 A 向包含了 AUTO_INCREMENT 列的表中新增数据时,就会持有自增锁。而此时其他的事务 B 则必须要等待,以保证事务 A 取得连续的自增值,中间不会有断层。

好了以上就是本篇博客的全部内容了,欢迎微信搜索关注【SH的全栈笔记】,回复【队列】获取MQ学习资料,包含基础概念解析和RocketMQ详细的源码解析,持续更新中。

如果你觉得这篇文章对你有帮助,还麻烦点个赞关个注分个享留个言

简单了解 MySQL 中相关的锁

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwpwzx.html