Innodb 锁类型:

说明:本文中如无特殊说明,默认为innodb引擎,事务隔离级别为RR。

Shared and Exclusive Locks

innodb 可以通过两种方式实现行级锁定,即Shared(S) lock和Exclusive Lock (X)。以下简称为S锁和X锁。

S锁为共享锁,持有S锁的事务可以对该行进行读取操作,且其他session对该行不可修改。

X锁为排他锁,持有X锁的事务可以对该行进行修改操作。

如果一条记录被加了S锁,那么其他事务仍可以对其加S锁。

如果一条记录被加了X锁,那么其他事务不可以对其他加S锁或者X锁。

下面一些情况会加S锁:

select ... lock in share mode , insert select ( select 中扫描到的记录), update 连表更新中不进行更新的表 ,

IF EXISTS(select 中扫描到的记录 ) ,使用外键时会对父键进行锁定 ...

下面一些情况会加X锁:

select ... for update , update 中要更新的内容 ...

S锁和X锁对相同记录的加锁一定要保持合理的顺序,否则会很容易造成死锁。

另外,从支持资源并发的角度出发,写各种语句一定要注意扫描的记录数,不仅仅是效率问题,更重要的是资源的利用最大化。

正确的认识X锁和S锁,对于资源的利用以及死锁查找是非常重要的。

Intention Locks

意向锁主要是为了支持多粒度锁机制而存在的一种锁,它不是由程序员去用程序控制,而是mysql自己来控制的。

举个例子来说明mysql的意向锁:

商场的一卫生间每晚都要进行锁门,清洁工大爷每天锁门前先进去挨个检查下了五个隔断是否有人,没有人了方可把卫生间落锁。

大爷觉得每天都要这样检查太麻烦,有没有一种办法我在门外都知道里面有没有人?有一天他终于想到了一个办法,他在门外挂了一个牌子,

正面写着“没人”,反面写着“有人”,而且他给所有上卫生间的人两条准则:

1 进入卫生间前,如果牌子是“没人”,那么一定要把牌子翻过来(“有人”)。

2 离开卫生间后,要检查下5个隔断,如果有人就直接离开,没人了要把牌子翻过来(“没人”)。

传说所有人都这样做了,然后老大爷晚上锁门的时候直接看下门口的牌子就可以决定锁门与否,再也不用自己进去检查了。

在上面的例子中,假设卫生间是一个数据表,里面的每一个隔断是一个数据行,那么卫生间门外的牌子就是意向锁。

Record Locks

Record lock是锁在索引上的,即使没有数据表没有索引,mysql会锁定聚簇索引。

Gap Locks

gap锁锁住的是索引的间隙,主要为了防止幻读的发生。

例如:有一表名为gap,里面有字段c2,c2上有索引(非唯一索引),目前c2有值为 2,4,7,10,几个值。

现在开启一个连接:

1 开始事务

2 更新c2值为4的记录 : update gap set remark = 'change' where c2 = 7;

(事务未提交)

现在开启另外一个连接:

1 开启一个事务

2 此时,测试会发现

> insert gap(c2, remark)  values(3,'');
// success > insert gap(c2, remark) values(5,'');
//block > insert gap(c2, remark) values(8,'');
//block

可以看出,在更新c2=7的记录时,(4,7) 与 (7,10)之间的记录都被锁住了,不能进行插入。

现在,如果把c2的索引修改为唯一索引,再次执行上面的例子,结果又会不一样,上面的三条记录全部都可以插入。

因此,在唯一索引上加锁是不会产生gap锁的。在生产中,如果使用for update 进行记录锁定时,where后尽量使用unique字段。

RR级别下,可以通过设置系统变量innodb_locks_unsafe_for_binlog来使Gap lock 禁用(在查询或者索引被扫描的时候)。

另外,如果删除或者更新的记录是通过唯一键进行扫描的时候,将不会有gap锁产生。(因此,在进行对记录的更改时,where后面最好用主键或者唯一键扫描,避免gap锁)

Next-Key Locks

next-key lock = record lock + gap lock;

小白学习mysql 之 innodb locks的更多相关文章

  1. 小白学习mysql之索引初步

    导语 索引在数据库中的地位是及其的重要,同时要想完全的掌握索引并不是一件容易的事,需要对数据的查询原理以及计算机操作系统有深刻的认识,当然相关的算法和数据结构也是必须的.因此,这篇文章感到了一些压力, ...

  2. 小白学习mysql之优化基础(EXPLAIN的连接类型)

    ## 导语很多情况下,有很多人用各种select语句查询到了他们想要的数据后,往往便以为工作圆满结束了.这些事情往往发生在一些学生亦或刚入职场但之前又没有很好数据库基础的小白身上,但所谓闻道有先后,只 ...

  3. 小白学习mysql之存储过程的优劣分析以及接入控制

    存储过程的优劣 存储过程是一组实现特定功能的SQL语句集合,存储过程一经编译便存储在了服务器上,可以通过调用存储过程的名字以及传入相应的参数来使用存储过程.要高层次的掌握存储过程,不能觉得依葫芦画瓢, ...

  4. 小白学习mysql之函数

    ## 导语 曾经我以为,学会了select.update.insert和delete之后,我就学会了数据库~,要不是到公司看到SQL里充满了密密麻麻的的各种函数,我差点就信了~,当初的自己是多么的天真 ...

  5. 重新学习MySQL数据库9:Innodb中的事务隔离级别和锁的关系

    重新学习MySQL数据库9:Innodb中的事务隔离级别和锁的关系 Innodb中的事务隔离级别和锁的关系 前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁 ...

  6. 重新学习MySQL数据库7:详解MyIsam与InnoDB引擎的锁实现

    重新学习Mysql数据库7:详解MyIsam与InnoDB引擎的锁实现 说到锁机制之前,先来看看Mysql的存储引擎,毕竟不同的引擎的锁机制也随着不同. 三类常见引擎: MyIsam :不支持事务,不 ...

  7. 重新学习MySQL数据库2:『浅入浅出』MySQL 和 InnoDB

    重新学习Mysql数据库2:『浅入浅出』MySQL 和 InnoDB 作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 sqlite 还是工程上使用非常广泛的 MySQL.P ...

  8. MySQL之InnoDB索引面试学习笔记

    写在前面 想要做好后台开发,终究是绕不过索引这一关的.先问自己一个问题,InnoDB为什么选择B+树作为默认索引结构.本文主要参考MySQL索引背后的数据结构及算法原理和剖析Mysql的InnoDB索 ...

  9. 《MySQL实战45讲》学习笔记4——MySQL中InnoDB的索引

    索引是在存储引擎层实现的,且在 MySQL 不同存储引擎中的实现也不同,本篇文章介绍的是 MySQL 的 InnoDB 的索引. 下文将以这张表为例开展. # 创建一个主键为 id 的表,表中有字段 ...

随机推荐

  1. About me and this site(2018/8/28)

    Name: 李秋豪 / [lǐ qiū háo] I'm a junior majoring in InfoSec at Harbin Institute of Technology. I'm int ...

  2. IO缓冲区

    标准IO提供的三种类型的缓冲模式: (1)按块缓存:在填满缓冲区后才进行实际的设备读写操作 (2)按行缓存:指在接收到换行符('\n’)之前,数据都是先缓存在缓冲区的 (3)不缓存:允许你直接读写设备 ...

  3. 有趣的npx

    在更新 npm 5.2.0 的时候发现会买一送一,自动安装了 npx. npx 会帮你执行依赖包里的二进制文件,也就是说 npx 会自动查找当前依赖包中的可执行文件, 如果找不到,就会去 PATH 里 ...

  4. mysql(安装、启动、删除)服务

    必须在管理身份下运行 方式一: 安装服务 将 MySQL 安装为服务的方式: "C:\Program Files\MariaDB 10.3\bin\mysqld.exe" inst ...

  5. CentOS 7 安装oracle 11.2.0.4 Error in invoking target 'agent nmhs' of makefile

    %86时出现报错   Error in invoking target 'agent nmhs' of makefile 解决方案在makefile中添加链接libnnz11库的参数修改$ORACLE ...

  6. Linux7静默安装Oracle11g教程,亲测实用有效!

    1.查看swap大小,若小于150M,需添加增加虚拟空间 dd if=/dev/zero of=/swapadd bs=1024 count=2006424 mkswap /swapadd swapo ...

  7. MySql使用入门

    SQL是Structure Query Language(结构化查询语言)的缩写. SQL主要可以分为三个类别: 1.DDL(Data Definition Languages)语句:数据定义语言,这 ...

  8. C++继承和派生练习(一)--关于从people(人员)类派生出student(学生)类等

    . 从people(人员)类派生出student(学生)类 添加属性:班号char classNO[]:从people类派生出teacher(教师)类, 添加属性:职务char principalsh ...

  9. python 面向对象类与类之间的关系

    主要内容: 1. 依赖关系 2. 关联关系, 组合关系, 聚合关系 3. 继承关系 4. 类中的特殊成员 引子 大千世界, 万物之间皆有规则和规律,我们的类和对象是对大千世界中的所有事物进行归类. 那 ...

  10. C#下载局域网共享文件夹中的文件

    在公司的局域网内部,有个主机,共享了几个文件夹给下面的客户机使用. 想要利用这个文件夹上传最新的winform程序版本,每次运行exe的时候检测局域网的软件版本达到更新exe的目的. 这里有个例子,是 ...