参看文章:

  1. innodb的意向锁有什么作用?
    2.《MySQL技术内幕:InnoDB存储引擎》

InnoDB存储引擎中的锁

InnoDB中的锁介绍

InnoDB存储引擎既支持行级锁,也支持表级锁,默认情况下采用行级锁。

InnoDB的锁类型有:共享锁(S Lock)、排他锁(X Lock)、意向共享锁(IS Lock)、意向排他锁(IX Lock)。

共享锁和排他锁非常简单,下面我们主要讲一下意向锁:

百度百科的解释:意向锁的含义是如果对一个节点加意向锁,则说明该节点的下层节点正在被加锁;对任意一节点加锁时,必须先对它的上层节点加意向锁。

在InnoDB中,为了既支持表级锁也支持行级锁,甚至支持行级锁和表级锁同时存在。所以在加行级锁的同时,会对整个表加上意向锁;如果同时有请求对表加表锁时:

  • 如果没有意向锁的话,则需要遍历整个表判断是否有行锁的存在,以免发生冲突。
  • 如果有了意向锁,只需要判断该意向锁与即将添加的表锁是否兼容即可。因为意向锁的存在代表了有行级锁的存在或者即将有行级锁的存在。

简而言之,意向锁就是为了让表锁快速感知到是否有行锁存在,以防表锁干扰到行锁的执行。

意向锁是一种表级锁,锁的粒度是整张表,主要分为意向共享锁(IS Lock)和意向排他锁(IX Lock)。意向锁是不会阻塞除全表扫描之外的任何请求。

两个意向排他锁或者意向排他锁之间都是相互兼容的,除非它们都需要对相同行加真实的排他锁。

IS and IX locks allow access by multiple clients. They won't necessarily conflict until they try to get real locks on the same rows。But a table lock (ALTER TABLE, DROP TABLE, LOCK TABLES) blocks both IS and IX, and vice-versa.

若将上锁的对象看成一棵树,那么对最下层的对象上锁,也就是对最细粒度的对象进行上锁,那么首先需要对粗粒度的对象上锁。如下图,当我们要对记录加上排他锁时,那么我们先要对数据库A、表、页都加上意向排他锁,最后再对记录加上排他锁,若其中任何一部分导致等待,那么该操作需要等待粗粒度锁的完成。

InnoDB中锁的实现算法

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

  • Record Lock:单个行记录上的锁。
  • Gap Lock:间隙锁,锁定一个范围,但不包括记录本身。GAP锁的目的,是为了幻读的问题。
  • Next-Key Lock:Gap Lock + Record Lock。锁定一个范围,并且锁定记录本身。

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

InnoDB中对于行的查询都是采用Next-Key Lock锁定算法。对于不同SQL查询语句,可能设置共享的(Share) Next-Key Lock和排他的(exlusive) Next-Key Lock,其主要目的也是为了解决幻行问题。但当查询的索引含有全部唯一属性(主键或唯一索引)时InnoDB存储引擎会对Next-Key Lock进行优化,将其降级为Record Lock,即仅锁住索引本身,而不是范围,从而提高应用的并发性。也就是说InnoDB存储引擎会自己选一个最小的算法模型。

但是如果查询的条件中包含的是辅助索引,则情况会完全不同,会产生如下锁情况:

  1. 首先会对辅助索引对应的主键索引加上Record Lock。
  2. 对辅助索引加上Next-Key Lock,锁定辅助索引的前一个区间。
  3. 对辅助索引的下一个区间加上gap Lock。

下面是一个示例:

我们知道InnoDB默认的事务隔离级别为REPEATABLE READ模式,而REPEATABLE READ模式下,Next-Key Lock算法又是默认的行记录锁定算法,所以就可以避免幻读的现象。

InnoDB 锁的更多相关文章

  1. innodb 锁分裂继承与迁移

    innodb行锁简介 行锁类型 LOCK_S:共享锁 LOCK_X: 排他锁 GAP类型 LOCK_GAP:只锁间隙 LOCK_REC_NO_GAP:只锁记录 LOCK_ORDINARY: 锁记录和记 ...

  2. InnoDB锁机制分析

    InnoDB锁机制常常困扰大家,不同的条件下往往表现出不同的锁竞争,在实际工作中经常要分析各种锁超时.死锁的问题.本文通过不同条件下的实验,利用InnoDB系统给出的各种信息,分析了锁的工作机制.通过 ...

  3. MySQL数据恢复和复制对InnoDB锁机制的影响

    MySQL通过BINLOG记录执行成功的INSERT,UPDATE,DELETE等DML语句.并由此实现数据库的恢复(point-in-time)和复制(其原理与恢复类似,通过复制和执行二进制日志使一 ...

  4. [转载] 数据库分析手记 —— InnoDB锁机制分析

    作者:倪煜 InnoDB锁机制常常困扰大家,不同的条件下往往表现出不同的锁竞争,在实际工作中经常要分析各种锁超时.死锁的问题.本文通过不同条件下的实验,利用InnoDB系统给出的各种信息,分析了锁的工 ...

  5. mysql innodb锁简析(2)

    继续昨天的innodb锁的分析: 注:此博文参考一下地址,那里讲的也很详细.http://xm-king.iteye.com/blog/770721 mysql事务的隔离级别分为四种,隔离级别越高,数 ...

  6. MySQL · 特性分析 · innodb 锁分裂继承与迁移

    http://mysql.taobao.org/monthly/2016/06/01/ innodb行锁简介 行锁类型 LOCK_S:共享锁 LOCK_X: 排他锁 GAP类型 LOCK_GAP:只锁 ...

  7. Innodb 锁系列2 事务锁

    上一篇介绍了Innodb的同步机制锁:Innodb锁系列1 这一篇介绍一下Innodb的事务锁,只所以称为事务锁,是因为Innodb为实现事务的ACID特性,而添加的表锁或者行级锁. 这一部分分两篇来 ...

  8. Innodb 锁 (简单笔记)

    看过很多innodb锁的文章,已经明白的就不写了,简单做个笔记   Innodb 锁的兼容性: 1.意向锁和意向锁之间都是兼容的 2.X(排他锁)与任何锁都是不兼容的 3.排他意向锁 IX 于S锁是不 ...

  9. MySQL- InnoDB锁机制

    InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION):二是采用了行级锁.行级锁与表级锁本来就有许多不同之处,另外,事务的引入也带来了一些新问题.下面我们先介绍一点背景知识 ...

  10. MySQL InnoDB锁机制

    概述: 锁机制在程序中是最常用的机制之一,当一个程序需要多线程并行访问同一资源时,为了避免一致性问题,通常采用锁机制来处理.在数据库的操作中也有相同的问题,当两个线程同时对一条数据进行操作,为了保证数 ...

随机推荐

  1. Zabbix利用msmtp+mutt发送邮件报警

    操作系统:CentOS 7 Web环境:Nginx+MySQL+PHP zabbix版本:zabbix-2.4.8.tar.gz 邮件服务:msmtp-1.4.32.tar.bz2     #http ...

  2. 关于strassen矩阵乘法的矩阵大小不是2^k的形式时,时间复杂度是否还是比朴素算法好的看法

    原来是n,找到大于等于n且是2^k形式的数m.n*n的矩阵补全为m*m的矩阵,原来的矩阵放在最左上方,其它位置的值为0.朴素方法:n^3现在:m^2.8即m/n需小于e^(3/2.8)=2.919才能 ...

  3. 团体程序设计天梯赛 L2-016. 愿天下有情人都是失散多年的兄妹

    同时也要记录父母的性别,输出询问时要用到 #include <stdio.h> #include <stdlib.h> #include <string.h> #i ...

  4. Dubbo、Zookeeper集群搭建及Rose使用心得(一)

    接触这个两三月了,是时候总结一下使用的方法以及心得体会了.我是一个菜鸟,下面写的如有错误,还请各位前辈指出.废话不多说,正式开始. 一.简介 Dubbo是Alibaba开源的分布式服务框架,它最大的特 ...

  5. RabbitMQ 相关概念

    RabbitMQ 整体上是一个生产者与消费者模型,主要负责接收.存储和转发消息.可以把消息传递的过程想象成:当你讲一个包裹送到邮局,邮局会暂存并最终将邮件通过邮递员送到收件人的手上,RabbitMQ ...

  6. 1044 Shopping in Mars

    Shopping in Mars is quite a different experience. The Mars people pay by chained diamonds. Each diam ...

  7. 【Asp.net入门5-04】SportsStore之添加分页

  8. Nginx反向代理websocket配置实例(官网)

    https://www.nginx.com/blog/websocket-nginx/ Blog Tech Rick Nelson of NGINX, Inc.   May 16, 2014   NG ...

  9. [Vue warn]: Do not mount Vue to <html> or <body> - mount to normal elements instead.

    官方文档是这么解释的: 提供的元素只能作为挂载点.不同于 Vue 1.x,所有的挂载元素会被 Vue 生成的 DOM 替换.因此不推荐挂载root实例到 <html> 或者 <bod ...

  10. [Java] 理解JVM之三:垃圾回收机制

    JVM内存中的各个区域都会回收吗? 首先我们知道 Java 栈和本地方法栈在方法执行完成后对应的栈帧就立刻出栈销毁,两者的回收率可以认为是100%:Java 堆中的对象在没有被引用后,即使用完成后会被 ...