MySQL八股学习记录5MySQL锁from小林coding

MySQL八股学习记录5MySQL锁from小林coding

锁的总览

MySQL锁分为三种,分别是全局锁,表级锁,行级锁

全局锁

使用全局锁的方式

cmd 复制代码
mysql<flush tables with read lock;

执行该命令后,整个数据库处于只读状态,数据的一切修改操作都会被阻塞

释放全局锁

cmd 复制代码
mysql<unlock tables

全局锁的应用:全库逻辑备份

全局锁的局限:业务阻塞停滞

避免方式:当数据库的引擎支持可重复读 的隔离级别,那么可以用事务来进行全库逻辑备份

表级锁

MySQL表级锁分类

  • 表锁
  • 元数据锁
  • 意向锁
  • AUTO-INC锁

表锁

加锁命令

SQL 复制代码
lock tables tablename read;//共享锁
lock tables tablename write;//独占锁

表锁的限制:

**表锁的粒度太大,会影响并发性能,**一般情况下使用粒度更细的行级锁

元数据锁

元数据锁不需要显式的使用,当对数据库表进行操作时,会自动给这个表加上MDL

  • 对一张表进行CRUD操作时,加的是MDL读锁
  • 对一张表进行表结构更改时,加的是MDL写锁
    MDL释放时机:事务提交后
    数据库长事务 对数据库的影响
    思考下述场景
  1. 事务A为长事务,执行select,加上MDL读锁
  2. 事务B企图修改表结构,这个时候想要MDL写锁,但是由于事务A的存在阻塞
    在这样的请款下,之后所有的查询都将会被阻塞,因为MDL的写锁优先级高于读锁,后续的CRUD操作将全部被阻塞
    反思:在改变表结构时,先看看数据库中的长事务,可以尝试kill掉长事务

意向锁

  • 使用InnoDB对某些记录上共享锁之前,需要在表级别上加上一个意向共享锁
  • 使用InnoDB对表中的某些记录上独占锁之前,需要先加上意向独占锁

当执行插入,更新,删除 等操作时,需要对表加上意向 独占锁,然后对具体的记录加锁,普通的select是不需要加锁的,普通的select通过MVCC完成一致性读,是无锁的

意向共享锁和意向独占锁是表级锁,不会与行级的独占锁和共享锁发生冲突.而且意向锁之间也不会发生冲突,只会和共享表锁,独占表锁发生冲突
意向锁作用:快速判断表里是否有记录被加锁

AUTO-INC锁

表里主键通常设置成自增的,插入数据时,可以不再指定主键的值,数据库会自动给主键赋递增的值,就是通过AUTO-INC锁实现

原理:AUTO-INC锁不再是一个事务提交后再释放,而是执行完插入语句后立刻释放

行级锁

行级锁三类:

  • Readcord Lock ,仅仅把一条记录锁上
  • Gap Lock,间隙锁,锁定一个范围,不包括记录本身
  • Next-Key-Lock:Recoed Lock + Gap Lock的组合,锁定一个范围,并且锁定记录本身

Record Lock

记录锁,锁住的是一条记录,记录锁有S锁和X锁的分别

Gap Lock

间隙锁,只存在可重复读级别,目的是为了解决可重复读下的幻读问题

Next-Key-Lock

Next-Key-Lock被称为临键锁,是Record+Gap Lock的组合,锁定一个前开后闭的范围,next-key lock 是包含间隙锁+记录锁的,如果一个事务获取了 X 型的 next-key lock,那么另外一个事务在获取相同范围的 X 型的 next-key lock 时,是会被阻塞的

插入意向锁

一个事务再插入一条记录时,判断插入位置是否被其他事务加了间隙锁,在此期间将生成一个插入意向锁

行级锁是如何作用的

不同场景,加锁的形式是不相同的
加锁的对象是索引,**基本单位是next-key-lock,**但在一些情况下,使用记录锁或者间隙锁就能避免幻读的情况下,next-key-lock将退化成记录锁或者间隙锁

唯一索引等值查询

唯一索引进行索引查询时,分为查询记录存在或者不存在

  • 存在:next-key-lock退化成record-lock
  • 不存在:找到第一条大于该记录的记录后,next-key-lock退化成gap-lock

唯一索引范围查询

范围查询会对每一个扫描到的索引加上next-key-lock,遇到下面的情况,会退化成记录锁或间隙锁

  • 大于等于的范围查询,若等于的记录存在表中,那么next-key-lock将退化成记录锁
  • 小于或者小于等于的范围查询:不在表中那么退化成gap-lock,在表中并且小于那么gap-lock,在表中小于等于不退化

非唯一索引等值查询

一个主索引,一个非唯一索引,那么加锁时,同时对两个索引都加锁,但对主键索引加锁的时候,仅在满足查询条件的记录才会对他们的主键索引加锁

相关推荐
草莓熊Lotso1 小时前
【C++ 基于微服务的即时通讯系统】etcd + brpc 从安装到服务注册发现全链路实战
网络·数据库·c++·redis·微服务·etcd
Lethehong6 小时前
Oracle 加个字段,目标库就报错?KFS 用“先拆后组“打通异构 DDL
数据库·oracle
Web极客码7 小时前
锁定真正的磁盘卡顿:我用 OpenCode 配合 eBPF 诊断 NVMe 队列深度延迟与 I/O 写放大
数据库·oracle
cspttty7 小时前
2027用户研究求职准备:应用统计学如何补齐研究设计与业务表达
大数据·数据库
roman_日积跬步-终至千里8 小时前
【数据Agent论文·查询与语义|05】Spider:为什么换一个数据库,模型就不会查了?
数据库·数据分析
猫咪很可爱9 小时前
Oracle RAC 启动失败排查:私网通信与内核参数优化实战
运维·数据库·oracle
XLYcmy9 小时前
《数字经济赋能城市低碳治理的路径研究检索报告》审阅与修改指导意见——基于完整检索报告体例的完整性诊断、学术规范核查与方法论纠偏 上
数据库·ai·chatgpt·文心一言·检索·知网·豆包
星恒随风9 小时前
Linux线程概念详解:从分页存储、页表、MMU与TLB,深入理解线程和进程的区别与联系
linux·运维·笔记·学习·状态模式
泡海椒9 小时前
JQuick-SQL 快速开始:注册内存表并执行查询
数据库·windows·sql
qq_284274059 小时前
数控机床编程基础与坐标系:编程六步流程、程序号/程序段/程序字格式,与右手定则下车床铣床XYZ轴判定(含考点)
笔记·学习·自动化·制造