Innodb中有哪些锁?
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中有哪些锁?的更多相关文章
- MySql InnoDB中的锁研究
# MySql InnoDB中的锁研究 ## 1.InnoDB中有哪些锁### 1. 共享和排他(独占)锁(Shared and Exclusive Locks) InnoDB实现标准的行级锁定,其中 ...
- Innodb中的锁
Innodb中的锁 共享锁和排它锁(Shared and Exclusive Locks)共享锁和排它锁是行级锁,有两种类型的行级锁 共享锁(s lock)允许持有锁的事务对行进行读取操作 排它锁(x ...
- 重新学习MySQL数据库7:详解MyIsam与InnoDB引擎的锁实现
重新学习Mysql数据库7:详解MyIsam与InnoDB引擎的锁实现 说到锁机制之前,先来看看Mysql的存储引擎,毕竟不同的引擎的锁机制也随着不同. 三类常见引擎: MyIsam :不支持事务,不 ...
- InnoDB这种行锁实现特点意味者:只有通过索引条件检索数据,InnoDB才会使用行级锁,否则,InnoDB将使用表锁!
InnoDB行锁是通过索引上的索引项来实现的,这一点MySQL与Oracle不同,后者是通过在数据中对相应数据行加锁来实现的. InnoDB这种行锁实现特点意味者:只有通过索引条件检索数据,InnoD ...
- 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,或 ...
- mysql 实验论证 innodb表级锁与行级锁
innodb 的行锁是在有索引的情况下,没有索引的表是锁定全表的. 表锁演示(无索引) Session1: mysql> set autocommit=0; mysql> select * ...
- Mysql InnoDB 数据更新导致锁表
一.数据表结构 CREATE TABLE `jx_attach` ( `attach_id` int(11) NOT NULL AUTO_INCREMENT, `feed_id` int(11) DE ...
- MySQL/InnoDB中,对于锁的认识
MySQL/InnoDB的加锁,一直是一个面试中常问的话题.例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?我在工作过程中,也会经常用到,乐观锁,排它锁,等.于是今天就对 ...
- InnoDB的锁机制浅析(二)—探索InnoDB中的锁(Record锁/Gap锁/Next-key锁/插入意向锁)
Record锁/Gap锁/Next-key锁/插入意向锁 文章总共分为五个部分: InnoDB的锁机制浅析(一)-基本概念/兼容矩阵 InnoDB的锁机制浅析(二)-探索InnoDB中的锁(Recor ...
随机推荐
- Docker —— 使用 Dockerfile 制作 Jdk + Tomcat 镜像
一.准备好Jdk和Tomcat apache-tomcat-8.5.50.tar.gz jdk-8u212-linux-x64.tar.gz 注意: Jdk 和 Tomcat 记得从官网下载,否则制作 ...
- cut命令用于按“列”提取文本字符,格式为“cut [参数] 文本”
8.cut命令 cut命令用于按"列"提取文本字符,格式为"cut [参数] 文本". 在Linux系统中,如何准确地提取出最想要的数据,这也是我们应该重点学习 ...
- named piped tcp proxy 下载
named piped tcp proxy 在某DN上面下载很麻烦,还要登录什么的,分享出来!希望大家支持 链接:https://pan.baidu.com/s/1fdJD6O0qb8_BkkrnMy ...
- C++知识点案例 笔记-6
1.三种友元函数 -非模板友元函数 -约束模板友元函数 -非约束模板友元函数 2.非类型参数 3.模板特化 1.三种友元函数 =====三种友元函数===== --1---非模板友元函数 #inclu ...
- sizeof 的妙用
(1)sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用.
- libevent中数据缓冲区buffer分析
很多时候为了应对数据IO的"慢"或者其他原因都需要使用数据缓冲区.对于数据缓冲,我们不陌生,但是对于如何实现这个缓冲区,相信很多时候大家都没有考虑过.今天就通过分析libevent ...
- Step By Step(Lua函数)
Step By Step(Lua函数) 一.函数: 在Lua中函数的调用方式和C语言基本相同,如:print("Hello World")和a = add(x, y).唯一的 ...
- harbor搭建及使用
harbor搭建及使用 1 系统及软件版本 1.1 系统版本 # uname -a Linux localhost.localdomain 3.10.0-862.el7.x86_64 #1 SMP ...
- Python API vs C++ API of TensorRT
Python API vs C++ API of TensorRT 本质上,C++ API和Python API应该在支持您的需求方面接近相同.pythonapi的主要优点是数据预处理和后处理都很容易 ...
- VB Aspose.Pdf 字体变小方格问题处理
宋体是这样写的:SimSun原先以为是:宋体 先定义字体,在PDF中无法设置,这个找了很久,原来是使用:FontRepository.FindFont方式,这个坑了很久,很多都说是setFont,压根 ...