当前位置: 首页 > news >正文

mysql 锁知识汇总

目录

  • 一、锁
    • 1.1 什么是锁?
    • 1.2 全局锁
      • 1.2.1 定义
      • 1.2.2 应用场景
      • 1.2.3 会出现的问题
      • 1.2.4 解决方法
    • 1.3 表级锁
      • 1.3.1 表锁
      • 1.3.2 元数据锁(MDL)
      • 1.3.3 意向锁
      • 1.3.4 AUTO-INC锁
    • 1.4 行级锁
      • 1.4.1 记录锁(Record Lock)
      • 1.4.2 间隙锁(Gap Lock)
      • 1.4.3 Next-Key Lock(记录锁+间隙锁)
      • 1.4.4 插入意向锁

一、锁

1.1 什么是锁?

**锁是用来控制对数据库中数据访问的机制。**在并发环境下,多个用户可能同时访问相同的数据,这样就会产生数据的冲突和不一致的情况,为了避免这种情况发生,MySQL提供了多种锁机制。

1.2 全局锁

1.2.1 定义

全局锁就是对整个数据库实例加锁。

MySQL提供了一个加全局读锁的方法,命令是:flush tables with read lock,执行后,整个数据库就处于只读状态了。

1.2.2 应用场景

全库逻辑备份。这样在备份数据库期间,不会因为数据或表结构的更新,而出现备份文件的数据与预期的不一样。

1.2.3 会出现的问题

加上全局锁,意味着整个数据库都是只读状态。

  • 那么如果数据库里有很多数据,备份就会花费很多的时间,关键是备份期间,业务只能读数据,而不能更新数据,这样会造成业务停滞。
  • 若从库备份,则在备份期间无法执行主库同步的binlog,则会导致主从延迟。

1.2.4 解决方法

前提:数据库的引擎支持的事务支持可重复读的隔离级别。例如Innodb,MyiSam不支持事务,所以只能全局锁。

mysqldump是官方的逻辑备份工具。当mysqldump使用参数-single-transaction时,将在导数据之前启动事务,由于MVCC的支持,数据可以在这个过程中正常更新。single-transaction仅适用于所有表使用事务引擎的库。

1.3 表级锁

1.3.1 表锁

  • 表共享读锁:lock tables t_student read;//表级别的共享锁,也就是读锁;读锁会阻塞写。
  • 表独占写锁:lock tables t_stuent write;//表级别的独占锁,也就是写锁;写锁会阻塞写和读 。
  • 释放锁:unlock tables;释放当前会话的所有表锁

1.3.2 元数据锁(MDL)

MDL不需要显式使用,数据库自动调用

对一张表进行 CRUD 操作时,加的是 MDL 读锁;
对一张表做结构变更操作的时候,加的是 MDL 写锁;
MDL 是为了保证当用户对表执行 CRUD 操作时,防止其他线程对这个表结构做了变更

当有线程在执行 select 语句( 加 MDL 读锁)的期间,如果有其他线程要更改该表的结构( 申请 MDL 写锁),那么将会被阻塞,直到执行完 select 语句( 释放 MDL 读锁)。

反之,当有线程对表结构进行变更( 加 MDL 写锁)的期间,如果有其他线程执行了 CRUD 操作( 申请 MDL 读锁),那么就会被阻塞,直到表结构变更完成( 释放 MDL 写锁)。
注意:事务执行期间,MDL 是一直持有的。开启长事务的同时其他事务变更表字段(MDL写锁),长事务不及时提交,会导致之后的所有操作都被阻塞。

MDL写锁优先级大于MDL读锁

1.3.3 意向锁

在使用 InnoDB 引擎的表里对某些记录加上「共享锁/独占锁(行锁)」之前,需要先在表级别加上一个「意向共享锁/意向独占锁」;

为什么会有意向锁?
表锁和行锁是满足读读共享、读写互斥、写写互斥的。
没有意向锁:加「独占表锁」时,就需要遍历表里所有记录,查看是否有记录存在独占行锁,这样效率会很慢。
意向锁:加「独占表锁」时,直接查该表是否有意向独占锁。
所以,意向锁的目的是为了快速判断表里是否有记录被加锁

1.3.4 AUTO-INC锁

主键自增使用的就是AUTO-INC锁

在插入数据时,会加一个表级别的 AUTO-INC 锁,然后为被 AUTO_INCREMENT 修饰的字段赋值递增的值,等插入语句执行完成后,才会把 AUTO-INC 锁释放掉。
AUTO-INC 锁是特殊的表锁机制,锁不是再一个事务提交后才释放,而是再执行完插入语句后就会立即释放。

但是, AUTO-INC 锁再对大量数据进行插入的时候,会影响插入性能,因为另一个事务中的插入会被阻塞。
轻量级的锁:在插入数据时,给该字段赋值一个自增的值后,直接释放,不再等待整条语句执行完毕。

1.4 行级锁

InnoDB 引擎是支持行级锁的,而 MyISAM 引擎并不支持行级锁。
共享锁(S锁)满足读读共享,读写互斥。独占锁(X锁)满足写写互斥、读写互斥。
在这里插入图片描述

1.4.1 记录锁(Record Lock)

只将当前数据加锁
S锁与X锁不兼容,X锁与X锁不兼容

1.4.2 间隙锁(Gap Lock)

锁定一个范围,但是不包含记录本身(左开右开区间)
只存在于可重复读隔离级别,目的是为了解决可重复读隔离级别下幻读的现象。

间隙锁之间是兼容的,即两个事务可以同时持有包含共同间隙范围的间隙锁,并不存在互斥关系,因为间隙锁的目的是防止插入幻影记录而提出的。

1.4.3 Next-Key Lock(记录锁+间隙锁)

锁定一个范围,并且锁定记录本身(左开右闭区间)

next-key lock 是包含间隙锁+记录锁的,如果一个事务获取了 X 型的 next-key lock,那么另外一个事务在获取相同范围的 X 型的 next-key lock 时,是会被阻塞的(XX互斥)。

1.4.4 插入意向锁

一个事务在插入一条记录的时候,需要判断插入位置是否已被其他事务加了间隙锁(next-key lock 也包含间隙锁)。
如果有的话,插入操作就会发生阻塞,在此期间会生成一个插入意向锁

插入意向锁名字虽然有意向锁,但是它并不是意向锁,它是一种特殊的间隙锁,属于行级别锁

相关文章:

  • 2024年:用OKR管理你的生活
  • 【Shell的运行原理以及Linux当中的权限问题】
  • nginx flv模块的使用和源码分析
  • 嵌入式中C 语言中的三块技术难点
  • Python 处理小样本数据的文档分类问题
  • k8s 部署 nocas 同时部署mysql
  • 备战蓝桥杯---搜索(剪枝)
  • CSS 闪电按钮效果
  • js正则综合练习1
  • springboot war包部署 和jar包部署
  • Python 轻量级定时任务调度:APScheduler
  • 系统架构设计师考试大纲2023
  • CSRF:跨站请求伪造攻击
  • 配置以服务方式启动并设置开机启动
  • 【Qt基本功修炼】Qt线程的两种运行模式
  • 《深入 React 技术栈》
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • JavaScript 一些 DOM 的知识点
  • Java程序员幽默爆笑锦集
  • Redis 懒删除(lazy free)简史
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 从伪并行的 Python 多线程说起
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 基于遗传算法的优化问题求解
  • 码农张的Bug人生 - 见面之礼
  • 每天一个设计模式之命令模式
  • 盘点那些不知名却常用的 Git 操作
  • 前端学习笔记之观察者模式
  • 深入 Nginx 之配置篇
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 网页视频流m3u8/ts视频下载
  • 为什么要用IPython/Jupyter?
  • 为视图添加丝滑的水波纹
  • 我有几个粽子,和一个故事
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #include
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (力扣)循环队列的实现与详解(C语言)
  • (三)docker:Dockerfile构建容器运行jar包
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (转载)OpenStack Hacker养成指南
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .htaccess配置常用技巧
  • .Net Core和.Net Standard直观理解
  • .NET Framework杂记
  • [ IOS ] iOS-控制器View的创建和生命周期
  • [20160807][系统设计的三次迭代]
  • [202209]mysql8.0 双主集群搭建 亲测可用
  • [C#][DevPress]事件委托的使用