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 也包含间隙锁)。
如果有的话,插入操作就会发生阻塞,在此期间会生成一个插入意向锁

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/450686.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python Moviepy 视频编辑踩坑实录2:音频如何修改为单通道

一、前言: 通过上一篇博文的处理,《Python Moviepy 视频编辑踩坑实录1:谁动了我的音频比特率》我们成功的把音频文件的音频采样率,成功的转化为了目标值:16000,但是接下来遇到了,下面的问题&am…

Flutter实现轮播图功能

一、在pubspec.yaml中添加: dependencies:# 轮播图card_swiper: ^3.0.1card_swiper: ^3.0.1,要获取最新版本:https://pub-web.flutter-io.cn/packages/card_swiper/versions,这个里面有文档可以看,如下图:…

机器学习5-线性回归之损失函数

在线性回归中,我们通常使用最小二乘法(Ordinary Least Squares, OLS)来求解损失函数。线性回归的目标是找到一条直线,使得预测值与实际值的平方差最小化。 假设有数据集 其中 是输入特征, 是对应的输出。 线性回归的…

MongoDB索引详情

文章目录 MongoDB索引MongoDB索引数据结构WiredTiger数据文件在磁盘的存储结构 索引的分类索引设计原则索引操作创建索引查看索引删除索引 索引类型单键索引(Single Field Indexes)复合索引(Compound Index)多键索引(M…

常见API

文章目录 Math类1.1 概述1.2 常见方法 System类2.1 概述2.2 常见方法 Runtime3.1 概述3.2 常见方法 Object类4.1 概述4.2 常见方法 Objects类5.1 概述5.2 常见方法 BigInteger类6.1 引入6.2 概述6.3 常见方法6.4 底层存储方式: 7 BigDecimal类7.1 引入7.2 概述7.3 常…

数据库连接池简介

顾名思义,数据库连接池本质上是个容器,负责分配和管理数据库连接——Connection,对标JDBC中的Conn对象。 一.简介 如果不存在连接池,则每次访问数据库时都需要建立新的连接对象,并在访问结束后销毁。长此以往会造成不…

COCO数据集介绍

COCO数据集介绍 什么是COCO数据集? COCO数据集是一个可用于图像检测、语义分割和图像标题生成的大规模数据集。它有超过330K张图像(其中220K张是有标注的图像),包含150万个目标,80个目标类别(行人、汽车、…

【DDD】学习笔记-识别限界上下文实践

先启阶段的领域场景分析是一个艰难的过程,我们要从纷繁复杂的业务需求细节中抽象出全部的领域场景,并通过剖析这些场景来获得一致的领域概念,提炼出主要的用户活动,并转换为用统一语言表达的领域行为。在这个过程中,用…

MySQL知识点总结(四)——MVCC

MySQL知识点总结(四)——MVCC 三个隐式字段row_idtrx_idroll_pointer undo logread viewMVCC与隔离级别的关系快照读和当前读 MVCC全称是Multi Version Concurrency Control,也就是多版本并发控制。它的作用是提高事务的并发度,通…

微信小程序课设(基于云开发)

微信小程序通过Laf云平台接入ChatGPT实现聊天&#xff0c;回答方式采用流式回答。 以下是图片展示其页面 回答次数通过卡密兑换 以下是对话页面的代码 <!--pages/content/content.wxml--><view class"container"><view class"div" hidde…

Android学习之路(29) Gradle初探

前言: 大家回想一下自己第一次接触Gradle是什么时候&#xff1f; 相信大家也都是和我一样&#xff0c;在我们打开第一个AS项目的时候&#xff0c; 发现有很多带gradle字样的文件&#xff1a;setting.gradle, build.gradle,gradle.warpper,以及在gradle文件中各种配置&#xff…

前端vue/react项目压缩图片工具@yireen/squoosh-browser

想要在前端项目中压缩图片&#xff0c;然后再上传到后端保存&#xff0c;就需要一个压缩工具的帮助&#xff0c;暂时有两个依赖库可以选择&#xff1a;image-conversion和yireen/squoosh-browser&#xff0c;看了官方仓库地址和更新时间等详情&#xff0c;发现还是yireen/squoo…