0、前言

上一篇从MySQL层面上了解锁,那么这篇我们从存储引擎上来了解, 以MySQL默认存储引擎Innodb来说,看看有哪些锁?(MySQL版本为8)

1、Shared and Exclusive Locks  -- 共享锁和排他锁

两者都是行级锁;

Shared Lock -- 共享锁(S), 也称为读锁。允许多个事务同一时刻并发读取同一记录,互不干扰。但不允许再加排他锁。

加锁方式:select * from table where xxx for share;

  

Exclusive Lock -- 排他锁(X),也称写锁。一个写锁会阻塞其它的写锁或读锁,保证同一时刻只有一个事务可以写入数据。

加锁方式:select * from table where xxx for update;

  

这里要注意下:

  • 如果没有指定某行,而扫描了表中的所有记录,则相当于表级锁了。

  • 在其他事务中没有操作的前提下,同一事务中是可以同时拥有某行的共享锁和排他锁的。

下面是的排他锁和共享锁的兼容性。

 

X

S

X

互斥

互斥

S

互斥

兼容

2、Intention Locks -- 意向锁

表级锁,指示事务稍后对表中的行需要哪种类型的锁(排他锁或共享锁)。所以又分为两种类型的意向锁。

IS(Intention Shared Lock):意向共享锁,表示事务打算在表中的各个行上设置共享锁。

IX(Intention Exclusive Lock): 意向排他锁,表示事务打算在表中的各个行上设置排他锁。

意向锁定协议如下:

在事务可以获取表中某行上的共享锁/排他锁之前,它必须首先获取该表上的意向共享锁/意向排他锁。例如:

  • select ... for share   需要先获取IS锁

  • select ... for update 需要先获取IX锁

  下面是表级别的锁类型兼容性。

 

X

IX

S

IS

X

互斥

互斥

互斥

互斥

IX

互斥

兼容

互斥

兼容

S

互斥

互斥

兼容

兼容

IS

互斥

兼容

兼容

兼容

  如果锁与现有锁冲突,则不授予该锁。

  特别注意

  • 意向锁除了全表请求(例如:Lock tables ... write)外,不阻止任何其他内容。

  • 意向锁的主要目的是表明有人正在锁定表中的行,或者将要锁定表中的行。

3、Record Locks -- 记录锁

记录锁是对索引记录的锁定。例如

select c1 from t where c1 = 10 for update;

表示防止任何其他事务插入、更新或删除t.c1=10的行。

4、Gap Locks -- 间隙锁

间隙锁是对索引记录之间的间隙的锁定。例如:

select c1 from t where c1 between 10 and 20 for update;

表示防止其他事务动(插入、更新或删除)t.c1在10~20中的记录。

特别注意:

  • 间隙锁是可以共存的。例如:事务A在间隙上添加一个间隙共享锁(Gap S-Lock),事务B可以在同一间隙上增加间隙排他锁(Gap X-Lock)

  • 间隙锁可以禁用。修改事务隔离级别至RC 或者 启用系统变量innodb_locks_unsafe_for_binlog

5、Next-Key Locks -- 下一个键锁

下一个键锁又称临界锁,是索引记录上的记录锁和索引记录之前的间隙上的间隙锁的组合。即Next-Key Lock 包含 Record Lock 和 Gap Lock。

默认情况下,InnoDB在可重复读取事务隔离级别下运行。在这种情况下,InnoDB使用next键锁进行搜索和索引扫描,从而防止幻读。

6、Insert Intension Locks -- 插入意向锁

插入意向锁是在行插入之前由插入操作设置的一种间隙锁。

7、AUTO-INC Locks -- 自增锁

AUTO-INC锁是一种特殊的表级锁,由插入到具有自动增量列的表中的事务使用。

8、总结

本次只是说明下相关概念, 下篇文章说下各种锁的实际用法,怎么查看加了什么锁,什么情况下会加什么锁。

Innodb中有哪些锁?的更多相关文章

  1. MySql InnoDB中的锁研究

    # MySql InnoDB中的锁研究 ## 1.InnoDB中有哪些锁### 1. 共享和排他(独占)锁(Shared and Exclusive Locks) InnoDB实现标准的行级锁定,其中 ...

  2. Innodb中的锁

    Innodb中的锁 共享锁和排它锁(Shared and Exclusive Locks)共享锁和排它锁是行级锁,有两种类型的行级锁 共享锁(s lock)允许持有锁的事务对行进行读取操作 排它锁(x ...

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

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

  4. InnoDB这种行锁实现特点意味者:只有通过索引条件检索数据,InnoDB才会使用行级锁,否则,InnoDB将使用表锁!

    InnoDB行锁是通过索引上的索引项来实现的,这一点MySQL与Oracle不同,后者是通过在数据中对相应数据行加锁来实现的. InnoDB这种行锁实现特点意味者:只有通过索引条件检索数据,InnoD ...

  5. 14.3.3 Locks Set by Different SQL Statements in InnoDB 不同的SQL语句在InnoDB里的锁设置

    14.3.3 Locks Set by Different SQL Statements in InnoDB 不同的SQL语句在InnoDB里的锁设置 locking read, 一个UPDATE,或 ...

  6. mysql 实验论证 innodb表级锁与行级锁

    innodb 的行锁是在有索引的情况下,没有索引的表是锁定全表的. 表锁演示(无索引) Session1: mysql> set autocommit=0; mysql> select * ...

  7. Mysql InnoDB 数据更新导致锁表

    一.数据表结构 CREATE TABLE `jx_attach` ( `attach_id` int(11) NOT NULL AUTO_INCREMENT, `feed_id` int(11) DE ...

  8. MySQL/InnoDB中,对于锁的认识

    MySQL/InnoDB的加锁,一直是一个面试中常问的话题.例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?我在工作过程中,也会经常用到,乐观锁,排它锁,等.于是今天就对 ...

  9. InnoDB的锁机制浅析(二)—探索InnoDB中的锁(Record锁/Gap锁/Next-key锁/插入意向锁)

    Record锁/Gap锁/Next-key锁/插入意向锁 文章总共分为五个部分: InnoDB的锁机制浅析(一)-基本概念/兼容矩阵 InnoDB的锁机制浅析(二)-探索InnoDB中的锁(Recor ...

随机推荐

  1. 凯撒密码Caesar

    //@132屋里上课群 #include<stdio.h>#include<stdlib.h>//颜色using namespace std;int jiami();int j ...

  2. 10.27-Redis-mz 深入浅出Redis

    深入浅出Redis 1.Redis的发展史     Redis[Remote Directory Server]:远程服务器字典 2.下载安装Redis 1>Linux下安装Reids     ...

  3. Prometheus 通过 consul 实现自动服务发现

    1.Consul 介绍 Consul 是基于 GO 语言开发的开源工具,主要面向分布式,服务化的系统提供服务注册.服务发现和配置管理的功能.Consul 提供服务注册/发现.健康检查.Key/Valu ...

  4. Linux信号(signal) 机制分析-(转自h13)

    [摘要]本文分析了Linux内核对于信号的实现机制和应用层的相关处理.首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理.接着分析了内核对于信号的处理流程包括信号的触发/注册/执 ...

  5. Centos7挂载windows共享目录

    将windows的共享目录挂载到Centos7 查看是否有mount.cifs命令,如果没有,在线安装 [root@dropbox-bak01 ~]# yum install cifs-utils - ...

  6. redis 处理缓存穿透

    1. 缓存穿透简述 举例说明,redis中确实没有key值为"redis"数据,并且数据库里面也没有,那么每一次都会穿过缓存层,会将请求打到数据库查询,然后数据库进行查询,造成了不 ...

  7. C语言编程 菜鸟练习100题(11-20)

    [练习11]计算 int, float, double 和 char 字节大小 0. 题目: 计算 int, float, double 和 char 字节大小 1. 分析: 使用 sizeof 操作 ...

  8. LNMP环境搭建与配置

    lnmp就是 Linux+nginx + mysql + PHP,把Apache替换为Nginx: 这里我用到的Linux环境为为centos,接下来就分步骤来一步步安装及测试. 一.安装php 参考 ...

  9. TODO不实现会报错

    kotlin.NotImplementedError: An operation is not implemented: Not yet implemented 会发生--当你 override fu ...

  10. ThinkPHP 全局异常处理

    wqy的笔记:http://www.upwqy.com/details/273.html 在thinkphp6 和 thinkphp5 全局异常处理 稍有不同 ThinkPHP6 在 tp6 中 框架 ...