加入收藏 | 设为首页 | 会员中心 | 我要投稿 西安站长网 (https://www.029zz.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

MySQL的又一神器-锁,MySQL面试必备

发布时间:2019-10-24 04:39:41 所属栏目:建站 来源:欧阳思海
导读:副标题#e# 1 什么是锁 1.1 锁的概述 在生活中锁的例子多的不能再多了,从古老的简单的门锁,到密码锁,再到现在的指纹解锁,人脸识别锁,这都是锁的鲜明的例子,所以,我们理解锁应该是非常简单的。 再到MySQL中的锁,对于MySQL来说,锁是一个很重要的特性

InnoDB存储引擎有3种行锁的算法,其分别是:

  •  Record Lock:单个行记录上的锁。
  •  Gap Lock:间隙锁,锁定一个范围,但不包含记录本身。
  •  Next-Key Lock:Gap Lock+Record Lock,锁定一个范围,并且锁定记录本身。

Record Lock:总是会去锁住索引记录,如果InnoDB存储引擎表在建立的时候没有设置任何一个索引,那么这时InnoDB存储引擎会使用隐式的主键来进行锁定。

Next-Key Lock:结合了Gap Lock和Record Lock的一种锁定算法,在Next-Key Lock算法下,InnoDB对于行的查询都是采用这种锁定算法。举个例子10,20,30,那么该索引可能被Next-Key Locking的区间为:

MySQL的又一神器-锁,MySQL面试必备

除了Next-Key Locking,还有Previous-Key Locking技术,这种技术跟Next-Key Lock正好相反,锁定的区间是区间范围和前一个值。同样上述的值,使用Previous-Key Locking技术,那么可锁定的区间为:

MySQL的又一神器-锁,MySQL面试必备

不是所有索引都会加上Next-key Lock的,这里有一种特殊的情况,在查询的列是唯一索引(包含主键索引)的情况下,Next-key Lock会降级为Record Lock。

接下来,我们来通过一个例子解释一下。

  1. CREATE TABLE test (  
  2.     x INT,  
  3.     y INT,  
  4.     PRIMARY KEY(x),    // x是主键索引  
  5.     KEY(y)    // y是普通索引  
  6. );  
  7. INSERT INTO test select 3, 2;  
  8. INSERT INTO test select 5, 3;  
  9. INSERT INTO test select 7, 6;  
  10. INSERT INTO test select 10, 8; 

我们现在会话A中执行如下语句;

  1. SELECT * FROM test WHERE y = 3 FOR UPDATE 

我们分析一下这时候的加锁情况。

  •  对于主键x   

MySQL的又一神器-锁,MySQL面试必备

  • 辅助索引y

MySQL的又一神器-锁,MySQL面试必备

用户可以通过以下两种方式来显示的关闭Gap Lock:

  •  将事务的隔离级别设为 READ COMMITED。
  •  将参数innodb_locks_unsafe_for_binlog设置为1。

Gap Lock的作用:是为了阻止多个事务将记录插入到同一个范围内,设计它的目的是用来解决Phontom Problem(幻读问题)。在MySQL默认的隔离级别(Repeatable Read)下,InnoDB就是使用它来解决幻读问题。

幻读:是指在同一事务下,连续执行两次同样的SQL语句可能导致不同的结果,第二次的SQL可能会返回之前不存在的行,也就是第一次执行和第二次执行期间有其他事务往里插入了新的行。

6 锁带来的问题

6.1 脏读

(编辑:西安站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读