参看文章:

  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. a标签--超链接

    一.链接到其他网站 <body> <a href="https://www.baidu.com" target="_blank">百度& ...

  2. Consul 服务发现与配置

    Consule 是什么 Consul包含多个组件,但是作为一个整体,为你的基础设施提供服务发现和服务配置的工具.他提供以下关键特性: 服务发现 Consul 的客户端可用提供一个服务,比如 api 或 ...

  3. 科学计算三维可视化---TraitsUI(Group对象组织界面)

    使用Group对象组织界面 将一组相关的Item对象组织在一起 from traitsui.api import Group from traits.api import HasTraits,Int, ...

  4. 科学计算三维可视化---TVTK管线与数据加载(数据集)

    一:数据集 三维可视化的第一步是选用合适的数据结构来表示数据,TVTK提供了多种表示不同种类数据的数据集 (一)数据集--ImageData >>> from tvtk.api im ...

  5. jQuery中使用attribute,prop获取,设置input的checked值

    1.prop方法获取.设置checked属性 当input控件checkbox设置了checked属性时,无论checked=”“或 checked=”checked”,$(obj).prop(“ch ...

  6. Shell记录-Shell命令(find)

    Linux中的find命令在目录结构中搜索文件,并执行指定的操作.Linux下find命令提供了相当多的查找条件,功能很强大.由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花 ...

  7. Centos7远程桌面 vnc/vnc-server的设置

    Centos7与Centos6.x有了很大的不同. 为了给一台服务器装上远程桌面,走了不少弯路.写这篇博文,纯粹为了记录,以后如果遇到相同问题,可以追溯. 1.假定你的系统没有安装vnc的任何软件,那 ...

  8. Java并发编程原理与实战十六:AQS

    一.概述 谈到并发,不得不谈ReentrantLock:而谈到ReentrantLock,不得不谈AbstractQueuedSynchronized(AQS)! 类如其名,抽象的队列式的同步器,AQ ...

  9. Java解决LeetCode72题 Edit Distance

    题目描述 地址 : https://leetcode.com/problems/edit-distance/description/ 思路 使用dp[i][j]用来表示word1的0~i-1.word ...

  10. python 分布式进程体验

    抽了点时间体验了一把python 分布式进程,有点像分布式计算的意思,不过我现在还没有这个需求,先把简单体验的脚本发出来,供路过的各位高手指教 注:需要先下载multiprocessing 的pyth ...