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

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

发布时间:2019-10-23 21:24:16 所属栏目:编程 来源:欧阳思海
导读:1 什么是锁 1.1 锁的概述 在糊口中锁的例子多的不能再多了,从迂腐的简朴的门锁,到暗码锁,再到此刻的指纹解锁,人脸辨认锁,这都是锁的光鲜的例子,以是,我们领略锁应该长短常简朴的。 再到MySQL中的锁,对付MySQL来说,锁是一个很重要的特征,数据库的

SELECT ... FOR UPDATE: 会对查询的行及相干联的索引记录加X锁,其他事宜哀求的S锁或X锁城市被阻塞。 当事宜提交或回滚后,通过这两个语句添加的锁城市被开释。 留意:只有在自动提交被禁用时,SELECT FOR UPDATE才可以锁定行,若开启自动提交,则匹配的行不会被锁定。

#### 同等性非锁定读

同等性非锁定读(consistent nonlocking read) 是指InnoDB存储引擎通过多版本节制(MVVC)读取当前数据库中行数据的方法。假如读取的行正在执行DELETE或UPDATE操纵,这时读取操纵不会因此去守候行上锁的开释。相反地,InnoDB会去读取行的一个快照。以是,非锁定读机制大大进步了数据库的并发性。

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

同等性非锁定读是InnoDB默认的读取方法,即读取不会占用和守候行上的锁。在事宜断绝级别READ COMMITTED和REPEATABLE READ下,InnoDB行使同等性非锁定读。

然而,对付快照数据的界说却差异。在READ COMMITTED事宜断绝级别下,同等性非锁定读老是读取被锁定行的最新一份快照数据。而在REPEATABLE READ事宜断绝级别下,则读取事宜开始时的行数据版本。

下面我们通过一个简朴的例子来声名一下这两种方法的区别。

起首建设一张表;

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

插入一条数据;

  1. insert into lock_test values(1); 

查察断绝级别;

  1. select @@tx_isolation; 

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

下面分为两种事宜举办操纵。

在REPEATABLE READ事宜断绝级别下;

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

在REPEATABLE READ事宜断绝级别下,读取事宜开始时的行数据,以是当会话B修改了数据之后,通过早年的查询,照旧可以查询到数据的。

在READ COMMITTED事宜断绝级别下;

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

在READ COMMITTED事宜断绝级别下,读取该行版本最新的一个快照数据,以是,因为B会话修改了数据,而且提交了事宜,以是,A读取不到数据了。

5 行锁的算法

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 

(编辑:湖南网)

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

热点阅读