面试必会 MySql的锁机制(InnoDB)
1. 引言
开发多用户、数据库驱动的应用时,最大的一个难点是:一方面要最大程度地利用数据库的并发访问,另一方面还要确保每个用户能以一致的方式读取和修改数据。为此就有了锁的机制 [1]。
2. 锁的分类
2.1. 按粒度
锁按粒度可分为表锁、页锁和行锁
- 表锁:直接锁定整个数据表。开销小,加锁快,不会发生死锁。锁冲突几率大,并发性能低。
- 行锁:锁定某个或某些行。开销大,加锁慢,会发生死锁。锁冲突几率小,并发性能高。
- 页表:介于表锁和行锁之间。
不难发现,表锁和行锁的特点基本是相反的,从应用场景上来说,表锁更适合以查询为主,只有少量按索引条件更新数据的应用;而行锁更适合有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用。
MyISAM支持表锁;InnoDB支持表锁和行锁
- 开销:维护锁是要占用内存的。
- 加锁速度:如果是表锁,咔嚓一下就锁住了;如果是行锁,要找到需要加锁的行,再加锁。
- 关于死锁,后面会详细讲
2.2. 按加锁方式
按加锁方式可分为共享锁(S Lock)和排他锁(X Lock);共享锁是读锁,排他锁是写锁,所以有人如是说:共享读锁,排他写锁。表、页和行都可以加共享锁和排他锁,下面以行锁为例说明规则
- 如果一个事务T获得了行R的共享锁,那么其他事务可以获得该行的共享锁,但是不能获得该行的排他锁
- 如果一个事务T获得了行R的共享锁,那么事务T只能对行R进行读操作
- 如果一个事务T获得了行R的排他锁,那么其他事务不能获得该行的任和锁
- 如果一个事务T获得了行R的排他锁,那么事务T能对行R进行读和写操作
2.3. 多粒度锁定--意向锁
InnoDB支持多粒度锁定,这种锁定允许事务在行级上锁和表级上的锁同时存在。为此,InnoDB支持一种额外的锁方式,即意向锁。在InnoDB中,意向锁是表级别的锁,有意向共享锁(IS Lock)和意向排他锁(IX Lock)两种。规定在事务在请求S锁和X锁前,需要先获得对应的IS、IX锁。意向锁是由存储引擎自己维护的,用户无需手动操作意向锁。
意向锁的作用:意向锁用于快速判断表锁和行锁之间是否有冲突。事务T在加表锁之前,要检查此表上是否已经有表锁或行锁,如果已经存在表锁,事务T立即阻塞。如果没有表锁,就要检查是否有行锁,这个过程效率很低,因为需要遍历整张表一行一行地检查。如果有了意向锁,任何事务在获取行锁之前必须先获得意向锁(表级别的),那么事务T发现表上已经被加了意向锁,就知道表中的某些行必然已经被锁,也就避免了遍历全表去检查。
3. InnoDB的行锁
InnoDB的行锁是加在索引之上的,这意味着只有通过索引条件检索数据,才会使用行锁,否则将使用表锁;不同的是Oracle数据库的行锁加在数据行上[2]。主要注意的是,不能仅仅通过where子句判断是否会用到索引,而是要看具体的执行计划。另外,当按照辅助索引检索数据时,对应的主键索引的索引项也会加上锁。
3.1. 行锁的3种算法
InnoDB存储引擎有3种行锁的算法,分别是
- Record Lock:单个行记录上的锁
- Gap Lock:间隙锁,锁定一个范围,但不包括记录本身
- Next-Key Lock:Gap Lock + Record Lock,锁定一个范围,包括记录本身
3.2. Next-Key Lock
采用Next-Key Lock的锁定技术称为Next-Key Locking,锁定命中的区间+下一个区间。Next-Key Lock是范围查找且命中记录时,InnoDB的默认行锁算法,可以把Record Lock和Gap Lock看作是它的降级/退化。其设计目的是为了解决幻读问题。例如有一个索引有10,11,13和20这四个值,那么可能被锁定的区间为:
如果一个事务T通过辅助索引查询11,那么锁定的范围是(10,11 ]和(11,13 ];如果通过辅助索引查询20,那么锁定的范围是(13,20 ]和(20, ]。注意,当通过主键索引/聚簇索引/唯一索引查询时候,因为此索引不允许有重复值,所以不必担心插入重复值导致幻读,所以InnoDB会对Next-Key Lock进行优化,将其降级为Record Lock,只锁查询记录本身。使用不存在的检索条件进行等值查询,使用Gap Lock,左开右开区间。对于范围查询,则会用Next-Key Lock。【这些的前提是用到了索引,即用到了行锁】
4. 死锁TODO
5. 总结
(1)InnoDB的行锁是加在索引之上的,这意味着只有通过索引条件检索数据,才会使用行锁,否则将使用表锁;
(2)InnoDB在可重复度隔离级别下,通过Next-Key Lock解决幻读问题;
(3)当通过主键索引/聚簇索引/唯一索引查询时候,InnoDB会对Next-Key Lock进行优化,将其降级为Record Lock。
引用资料
[1]《MySql技术内幕--InnoDB存储引擎》第二版.姜承尧
[2] MySQL中的锁(表锁、行锁)
[3] 阿里P6+的Mysql锁机制二面试总结,值得收藏
面试必会 MySql的锁机制(InnoDB)相关推荐
- Mysql的锁机制之表锁
Mysql的锁机制之表锁 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在数据库中,除传统的计算资源(如CPU,RAM,I/O等)的争用外,数据也是一种供许多用户共享的资源,如何保证数据并发访 ...
- MySQL调优(八):查缺补漏(mysql的锁机制,读写分离,执行计划详解,主从复制原理)
mysql的锁机制 1.MySQL锁的基本介绍 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的 计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共 ...
- mysql默认锁机制是什么_MySQL中锁机制的原理是什么
MySQL中锁机制的原理是什么 发布时间:2020-12-08 14:48:30 来源:亿速云 阅读:81 作者:Leah MySQL中锁机制的原理是什么?针对这个问题,这篇文章详细介绍了相对应的分析 ...
- mysql 释放行锁_《深入精通Mysql(三)》深入底层Mysql各种锁机制(面试必问)...
我们知道,数据也是一种供许多用户共享访问的资源.如何保证数据并发访问的一致性.有效性,是所有数据库必须解决的一个问题,锁的冲突也是影响数据库并发访问性能的一个重要因素.从这一角度来说,锁对于数据库而言 ...
- MySQL数据库锁机制之MyISAM引擎表锁和InnoDB行锁详解
MySQL中的锁概念 Mysql中不同的存储引擎支持不同的锁机制.比如MyISAM和MEMORY存储引擎采用的表级锁,BDB采用的是页面锁,也支持表级锁,InnoDB存储引擎既支持行级锁,也支持表级锁 ...
- MySQL数据库读现象 数据库锁机制 Innodb存储引擎行级锁
数据库读现象 数据库管理软件的"读现象"指的是当多个事务并发执行时,在读取数据方面可能碰到的问题,包括有脏读.不可重复读和幻读. 创建数据表 # 创建数据表 create tabl ...
- mysql更新锁机制_mysql查询更新时的锁表机制分析
欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入 为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制. 一.概述 MySQL有三种锁 ...
- 【MySQL】深入浅出剖析mysql事务锁机制 - 笔记
事务的基本概念 事务的特点(ACID) 快照:之前的某一个历史的状态(类比虚拟机的快照),用于实现原子性 隔离性:通过锁机制来实现 锁:共享锁,排它锁,独占锁,临键锁,间隙锁,自增锁,意向锁 持久性: ...
- mysql insert锁机制
一.前言 上周遇到一个因insert而引发的死锁问题,其成因比较令人费解. 于是想要了解一下insert加锁机制,但是发现网上介绍的文章比较少且零散,挖掘过程比较忙乱. 本以为只需要系统学习一个较完全 ...
- 对比Oracle和Mysql在锁机制上的类似和差异点
转:https://blog.csdn.net/c332472988/article/details/52804078 InnoDB行锁实现方式 InnoDB行锁是通过给索引上的索引项加锁来实现的,这 ...
最新文章
- 线程间操作无效: 从不是创建控件的线程访问它
- 拓展小知识(一)——使用 CSS 和 JS 加载阿里小图标
- 集成学习算法之boosting、bagging和随机森林算法原理
- 使用计算机加密码,给正使用的电脑设置密码
- 小程序·云开发实战 - 迷你微博
- 语音专题第四讲,语音识别之解码器技术简介|大牛讲堂
- NKOJ1472 警卫安排
- unity 特效shader下载_Unity shader消融特效——(1)逻辑节点篇
- PHP简单留言板代码
- 工艺过程卡片,工序卡片,工艺卡,刀具卡区别
- 华为交换机系统软件升级和安全漏洞修复教程
- python主函数_Python main() 函数
- 60秒学脑科学常识:《科学美国人》专栏文集
- 基于pytorch的OCR识别库
- kbd通达2017版破解后,自定义菜单无法调用表单开启流程/kbdkbd 错误,请联系管理员 /general/approve_center/new/insert.php/kbd
- ios8在通用设置中文键盘无效的解决方法(中文键盘设置)
- 完整目标检测项目流程——从使用LabelImg标注到使用YOLOv5训练测试
- MT2503原理图芯片资料整合下载,MT2503处理器概述
- 为什么用抓包工具看HTTPS包是明文的
- 有些工具程序员不用也要掌握(想到就写,不定期更新)