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

MySQL InnoDB锁先容及差异SQL语句别离加什么样的锁

发布时间:2019-06-26 02:48:26 所属栏目:编程 来源:java互联网架构
导读:阅读提醒 本文所参考的MySQL文档版本是8.0,做尝试的MySQL版本是8.0.13 本文首要参考了MySQL官方文档 InnoDB锁定和事宜机制 本文还参考了何登成的 MySQL加锁处理赏罚说明、一个最不行思议的MySQL死锁说明 以及阿里云RDS-数据库内核组的 常用SQL语句的MDL加锁源

到此为止,MySQL InnoDB 8种范例的锁我们就先容完了。我们以一个例子竣事8种范例的先容。

MySQL InnoDB锁先容及差异SQL语句别离加什么样的锁

T1先执行,事宜ID是8428;T2后执行,事宜ID是8429

上图演示了:

  1. 任何事宜,在锁定行之前,都必要先加表级锁intention lock,即:第三行的IX和第一行的IX。
  2. idx_c是帮助索引,InnoDB扫描idx_c时碰着了c=222,于是,在idx_c上加了next-key lock,即:第四行的X。next-key lock就是 index record lock+gap lock,于是此next-key lock锁定了idx_c上值为222的索引记录,以及222前面的间隙,也就是间隙(22, 222)。
  3. idx_c是帮助索引,在主键索引之外的任何索引上加index record lock时,都必要在该行的主键索引上再加index record lock,于是,又在PRIMARY上添加了index record lock,即:第五行的X,REC_NOT_GAP。
  4. InnoDB扫描完c=222后,又扫描到了c=2222,这是idx_c上,第一个不满意索引扫描前提的索引记录,于是InnoDB在c=2222上加gap lock,c=2222上的gap lock锁定的范畴是“idx_c上2222前面的间隙”,这本应该是(222, 2222),但,T1即将在idx_c上插入c=224,于是,c=2222上的gap lock锁定的范畴是(224, 2222)。即:第六行的X,GAP。
  5. InnoDB即将在idx_c上插入c=224,224也是不满意c=222的,于是InnoDB在c=224上加gap lock,该gap lock锁定了224前面的间隙,也就是(222, 224),即,第七行的X,GAP。
  6. T2执行INSERT乐成后,会在新插入行的加index record lock,但,T2在插入之前,起主要作的是获得表级锁intention lock以及配置表的每个索引的insert intention lock,该锁的范畴是(插入值, 向下的一个索引值),于是,在配置idx_c上的insert intention lock范畴就是(226, 2222),这个范畴和事宜T1第六行gap lock范畴(224, 2222)重叠。于是,事宜T2被阻塞了,T2必需守候,直到T1开释第六行的gap lock。

performance_schema.data_locks表中并不能看到T2的所有锁,好比,T2也得在iux_b上配置insert intention lock,但,performance_schema.data_locks中并没有这个锁。关于performance_schema.data_locks中表现了哪些锁,请见本文最后一段。

把这些锁及其范畴列出来如下图所示

MySQL InnoDB锁先容及差异SQL语句别离加什么样的锁

四、差异的SQL加了什么样的锁?

OK,我们已经相识了InnoDB各类差异范例的锁,那么,差异SQL语句各加了什么样的锁呢

我们用最朴实的设法来思索一下,用锁作什么呢?锁要作的就是到达事宜断绝的目标,即:两个并发执行的事宜T1和T2,假如T1正在修改某些行,那么,T2要并发 读取/修改/插入 满意T1查询前提的行时,T2就必需被阻塞,这是锁存在的基础缘故起因。index record lock, gap lock, next-key lock都是实现本领,这些本领使得锁既能到达目标,还能实现最大的并发性。以是,当我们思量事宜T1中的SQL上加了什么锁时,就想一下,当T1执行时,假如并发的事宜 T2不会触及到T1的行,则T2无需被阻塞,假如T2的要 读取/修改/插入 满意T1前提的行时,T2就得被T1阻塞。而T1阻塞T2的详细实现就是:T1在已存在的行上加index record lock使得T2无法触碰已存在的行,以及,T1在不存在的行上加gap lock使得T2无法插入新的满意前提的行。

前面我们说过“加什么样的锁”与以下身分相干

  1. 当前事宜的断绝级别
  2. SQL是同等性非锁定读(consistent nonlocking read)照旧DML或锁定读(locking read)
  3. SQL执行时是否行使了索引,所行使索引的范例(主键索引,帮助索引、独一索引)

我们来看一下,差异的断绝级别下,行使差异的索引时,别离加什么锁。在接头之前,我们先剔除无需接头的环境

起首,平凡SELECT 行使同等性非锁定读,因此基础不存在锁。无需接头;

再者,作为开拓者,我们险些从来不会行使到断绝级别RU和Serializable。这两个断绝级别无需接头。

于是,剩下的就是 给定锁定读SELECT或DML(INSERT/UPDATE/DELETE)语句,在差异断绝级别下,行使差异范例的索引时,别离会加什么样的锁?直接给出谜底,其加锁原则如下

(一)、RR时,假如行使非独一索引举办搜刮或扫描,则在所扫描的每一个索引记录上都配置next-key lock。

(编辑:湖南网)

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

热点阅读