共享锁和排它锁

InnoDB实现了标准的行级锁,包括两种类型:共享锁(S)和排它锁(X)

  • 一个共享锁(S)允许事务持有这种锁来读取一行
  • 一个排它锁(X)允许事务持有这种锁来修改或删除一行

如果事务T1对行r持有一个共享锁(S),那么来自其它事务T的对于行r的锁的请求处理如下:

  • 如果T2请求的是共享锁(S),那么将立即被授予共享锁。这样的话,T1和T2都持有r的共享锁(S)
  • 如果T2请求的是排它锁,则不能被立即授予

如果事务T1持有行r的排它锁,那么来自其它事务T2对r的任何锁请求都不能被立即授予。此时,T2必须等待T1释放对r锁持有的锁。

意向锁

InnoDB支持多种粒度的锁,它允许行级别的锁和表级别的锁共存。为了支持多种粒度级别的锁,需要用到另外一种锁,叫意向锁。在InnoDB中,意向锁是表级别的锁,它表示稍后会锁定表中的一行。有两种类型的意向锁:

  • 意向共享锁(IS):事务T打算在表t中的某个行上设置共享锁(S)
  • 共享排它锁(IX):事务T打算在这些行上设置排它锁(X)

例如,SELECT ... LOCK IN SHARE MODE将设置一个IS锁,而SELECT ... FOR UPDATE将设置一个IX锁

意向锁协议如下:

  • 一个事务在获得表t上的某一行的共享锁(S)之前,它必须先在表t上获得意向共享锁(IS)或者更高级别的锁
  • 一个事务在获得表t上的某一行的排它锁(X)之前,它必须现在表t上获得意向排它锁(IX)

一个锁被授予一个事务请求必须保证和已经存在的锁兼容,如果冲突的话将不能被授予。一个事务必须等待知道和它想获得的锁冲突的存在的锁被释放。

记录锁

一个记录锁是一种在索引记录上的锁。例如,SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE;阻止其它事务对t.c1=10的行的添加修改删除操作。

记录锁总是锁定索引记录,即使表没有定义索引。对这种情况,InnoDB会创建隐藏的索引,并且用这个索引来加锁。

间隙锁

一个间隙锁是加在索引记录之间的间隙的锁,或者在第一个索引记录之前或者在最后一个索引记录之后的锁。例如,SELECT c1 FROM t WHERE c1 BETWEEN 10 AND 20 FOR UPDATE;阻止其它事务插入一个值15在t.c1列上,因为在这个范围内的所有存在的值的间隙之间已经被锁定。

一个间隙可能跨过一个单个的索引值,也可能跨过是多个索引值,甚至是空。

间隙锁是在性能和一致性上的一个折中的方式,它被用在某些事物隔离级别上。

Next-Key锁

一个next-key锁是一个在索引记录上的记录锁和一个在索引记录之前的间隙的间隙锁的一个结合。

InnoDB允许行级别的锁以这样的方式,当它搜索或者扫描一个表的索引时,会给它扫描到的索引记录设置共享或排它锁。因此,行级别的锁实际上是索引记录锁,一个next-key锁是一个索引记录锁加上一个在索引记录之前的间隙的间隙锁。如果一个会话持有一个索引记录R的共享或者排它锁,那么另外一个会话不能在这个记录R之前插入新的索引值。

假设一个索引包含的值有:10、11、13、20,那么对这个索引的next-key锁会包含下面这样几个间隔,也就是说锁定范围覆盖这些区间:

这是前开后闭区间

默认情况下,InnoDB的默认隔离级别是REPEATABLE_READ。在这种情况下,对于检索和索引扫描,InnoDB使用next-key锁。

总结:

1、记录锁是索引记录上的锁

2、间隙锁是索引记录之间的间隙的锁

3、next-key锁是记录锁加上间隙锁

4、行级别锁实际上是记录锁

5、意向锁是表级别的锁

参考 https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html

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. 【Win 10 应用开发】MIDI 音乐合成——音符消息篇

    在上一篇中,老周介绍了一些乐理知识,有了那些常识后,进行 MIDI 编程就简单得多了.尽管微软已经把 API 封装好,用起来也很简单,但是,如果你没有相应的音乐知识基础,你是无法进行 MIDI 编程的 ...

  2. JPA学习笔记(8)——映射双向一对多关联关系

    双向一对多关联关系 前面的博客讲的都是单向的,而本问讲的是双向的(双向一对多 = 双向多对一) 什么是双向? 我们来对照一下单向和双向 单向/双向 User实体类中是否有List< Order& ...

  3. 海量服务实践──手 Q 游戏春节红包项目设计与总结(上篇)

    导语 大哥说.今年手Q游戏的春节红包你来做.那该怎么做?以及怎么做才干让大哥放心?本文从后台的角度出发讲述了这个过程和方法.对于关键的前台部分也有所涉及. 文件夹 1.需求背景 1.1.红包类别 1. ...

  4. 技术债务管理以及Firefox/Chromium的债务评价

    如今的软件开发是在遍地敏捷,人人讲唯快不破的时代,哪有人有时间思考代码质量,设计的质量? 哪个又不是从一堆代码中杀出血路来实现还有一个功能?一个产品都存活不了几年,何必考虑什么可维护性? 我们追求进度 ...

  5. 第03章-VTK系统概述(1)

    [译者:这个系列教程是以Kitware公司出版的<VTK User's Guide -11th edition>一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934- ...

  6. canvas图形函数

    function drawStar(cobj,x, y, radius1, radius2, num, drawType, color) {//参数:画笔,圆心X.圆心Y,半径1,半径2,形状边,实心 ...

  7. java做成windows服务,电子秤例子,开机自动启动

    使用Java Service Wrapper工具制作 1.windows32位下载地址 https://sourceforge.net/projects/wrapper/files/ 2.window ...

  8. 《编程人生:15位软件先驱访谈录》【PDF】下载

    <编程人生:15位软件先驱访谈录>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382231 内容简介 本书适合所有程序员,也适合 ...

  9. JavaScript:AOP实现

    AOP的概念,使用过Spring的人应该都不陌生了.Dojo中,也是支持AOP的.对于JavaScript的其他框架.库不知道有没有AOP的支持.相信即便没有支持,也不会太远了.下面就介绍一下使用Ja ...

  10. Python 项目实践二(下载数据)第三篇

    接着上节继续学习,在本章中,你将从网上下载数据,并对这些数据进行可视化.网上的数据多得难以置信,且大多未经过仔细检查.如果能够对这些数据进行分析,你就能发现别人没有发现的规律和关联.我们将访问并可视化 ...