mysql的锁--一篇读懂所有锁机制
目录
mysql的锁
概述:根据mysql锁的大类型可以分为
我们先来讲一下范围最大的全局锁
使用
为什么要使用全局锁?
使用全局锁进行备份的缺点
表级锁
表锁
1.共享读表锁的语法
2.排斥写表锁
元数据锁
意向锁
什么是意向锁
怎么产生意向锁
意向锁的作用
AUTO-INC 锁
行级锁
记录锁
记录共享锁
记录排斥锁
mysql的锁
主要规则:读读锁兼容,写写锁不兼容,读写锁不兼容
概述:根据mysql锁的大类型可以分为
- 全局锁
- 表级锁:表锁 意向锁 元数据锁 AUTO-INC锁
- 行级锁:记录锁,间隙锁,next-key锁(记录锁加间隙锁)
我们先来讲一下范围最大的全局锁
使用
只要全局锁一旦加上, 所有的增删改的操作都不能被执行,整个数据库只会处于只读状态
在一个会话里加上全局锁
flush tables with read lock
只能执行读操作,执行增删改操作会直接报错
在其他会话里
也可以执行查询操作,但是执行增删改操作会被阻塞,直到全局锁释放才会去执行当前操作
解锁
unlock tables
解锁之后 ,阻塞的操作就会被执行
为什么要使用全局锁?
我们需要对整个数据库的数据进行备份时 ,就需要使用全局锁。
如果在一个库中有一张订单表,商品余额表
当我们对这个数据库的数据进行备份时,先对订单表进行备份,这时一个其他的并发事务执行了购买操作,减少的订单余额,这时候再去备份的商品余额表就与之前备份的订单表数据不一致了。
使用全局锁进行备份的缺点
当我们使用全局锁时,只有查询的业务可以运行,而增删改的业务都被阻塞,这是我们十分不想看到的,那有什么方法可以解决吗,有的,如果数据库的引擎支持的事务支持可重复读的隔离级别,那么在备份数据库之前先开启事务,会先创建 Read View,,然后整个事务执行期间都在用这个 Read View,而且由于 MVCC 的支持,备份期间业务依然可以对数据进行更新操作。
这就是事务中的隔离性,就算其他事务对数据表进行了操作,数据库备份时只会对read view进行备份
备份数据库的工具是 mysqldump,在使用 mysqldump 时加上 –single-transaction
参数的时候,在备份数据库之前先开启事务。这种操作只适合于可重复读级别的隔离机制,而mysql默认的innodb存储引擎就是可重复读的隔离机制。
表级锁
表锁
我们现在来讲以下表级锁的表锁 ,这是一个用来锁着一整张表的锁。
可以分为共享读表锁,排斥写表锁。
1.共享读表锁的语法
共享读表锁就是让这张表只能读,增删改操作都不可以执行
lock tables 表名 read;
演示共享读表锁
在一个会话里给person表加上共享读表锁
可以发现对这张表只能读,增删改操作都会直接报错
在其它会话里
也可以读,但是增删改操作都会被阻塞
释放锁
其他会话的阻塞操作也会被执行
注意:如果当前会话对person表加了共享读表锁后,也不能操作其他表的数据了,连查询都不可以,其他会话则可以
2.排斥写表锁
如果当前会话对一张表加了排斥写表锁,那么只能让当前对话能对这张表进行CRUD操作,其他会话不能查询这个表,也不能增删改
lock table 表名 write;
演示
当前会话对person加了排斥写表锁,可以进行CRUD操作
其他会话,所有对这个表的操作都会被阻塞
我们也可以发现对整个表直接进行加排斥写锁后,其他会话都无法操作 这个表,对并发事务十分不友好,性能十分低下,所以innodb有了行锁这种更小粒度的锁。
元数据锁
我们之前讲的全局锁和表锁都是需要我们进行显示调用的,而这个元数据锁,意向锁(增删改)和行锁(增删改)是自动调用的,所以我们需要开启事务来查询加锁的情况,因为事务一旦结束,这些锁都会自动释放。这也是我们为什么一定要开启事务来查看加锁的情况,因为mysql是自动提交事务的(执行一行sql后自动提交),然后这些自动加的锁我们就无法观察到了。
元数据锁的作用是什么-->用来解决DML语句和DDL语句的冲突,假设我们在事务a中进行了增删改操作,而事务b把表的结构给改了,这显然是不被允许的。
元数据锁的类型-->MDL读锁(进行CRUD时的事务进行加的锁)
-->MDL写锁(进行修改表结构时的事务加的锁)
这两个锁是不兼容的,在事务a中先对person表进行了CRUD操作,那么这个表会被加上MDL读锁,这时事务b想对person表进行DDL,操作表数据时,想要去给这个表加MDL写锁时,因为MDL读锁与MDL写锁不兼容,所以MDL写锁无法加上,DDL语句也无法执行,b事务就只能阻塞等待a事务提交释放MDL读锁。
但是经过我的操作,如果先在事务a修改的表结构,在事务b中可以进行CURD操作
演示
在事务a中进行CURD操作,这是这张表已经被加上的MDL读锁
事务b想要去修改表结构时,会阻塞,因为MDL写锁无法加上,与MDL读锁无法兼容,会阻塞等待
事务a提交
表结构成功改变
意向锁
意向锁进行增删改操作也是自动调用加锁的,事务结束自动解锁。
什么是意向锁
意向锁和行锁是息息相关的,我们在对行数据进行加锁时,会先产生一个表级别的意向锁,共享读行锁产生意向共享锁,排斥写行锁产生意向排斥锁。
意向锁之间也不会发生冲突
- 意向共享锁读可以兼容共享读表锁,与排斥写表锁不兼容(读读锁共享)
- 意向排斥写锁与共享读表锁不兼容,与排斥写表锁不兼容(写读锁不共享,写写锁不共享)
怎么产生意向锁
普通的select语句不会产生行锁,只会产生MDL读锁
这就要先讲一下怎么产生共享读行锁,排斥写行锁
共享读行锁:加上这个共享读行锁之前,先在表加上了意向共享读锁
select ... lock in share mode;
排斥写行锁:加上这个排斥写行锁之前,先在表加上了意向排斥写锁
select ... for update;
当执行插入、更新、删除操作,需要先对表加上「意向独占锁」 ,然后对该记录加独占锁。
执行插入操作
产生了意向排斥锁
IX
select * from performance_schema.data_locks\G;
意向锁的作用
在对一张表加表锁时,需要判断这张表里有没有行锁,如果没有意向锁,那就需要去全表扫描判断有没有行锁,这显然效率十分低下,如果有了意向锁就可以直接判断这张表里有没有行锁。
AUTO-INC 锁
现在数据表进行插入数据时,主键都是自增的,使用auto_increment;
AUTO-INC锁就是实现这个的基础,在插入数据时,先给这个表加上AUTO-INC锁,然后把赋值数据给自增字段,插入完成之后,锁会自动释放
所以这个AUTO-INC锁不是事务结束后释放,而是执行插入语句结束后释放。
AUTO-INC 锁再对大量数据进行插入的时候,会影响插入性能,因为另一个事务中的插入会被阻塞(等着被赋值)。
InnoDB 存储引擎提供了一种轻量级的锁来实现自增。
一样也是在插入数据的时候,会为被 AUTO_INCREMENT
修饰的字段加上轻量级锁,然后给该字段赋值一个自增的值,就把这个轻量级锁释放了,而不需要等待整个插入语句执行完后才释放锁。
行级锁
innodb相比于myisam的三大特点:支持事务,外键约束,行级锁
行级锁的类型主要有三类:
- Record Lock,记录锁,也就是仅仅把一条记录锁上(更新和删除数据时会对这个数据加排斥写锁,插入数据时也会,防止被其他事务修改);
- Gap Lock,间隙锁,锁定一个范围,但是不包含记录本身;
- Next-Key Lock:Record Lock + Gap Lock 的组合,锁定一个范围,并且锁定记录本身。(加入有1,3两个数据,next-lock锁的是3记录本身,和1,3之间的范围)
记录锁
记录锁也分有记录共享读锁和记录排斥写锁,也是经典的读读锁兼容,读写锁不兼容,写写锁不兼容
记录共享锁
如何加上记录共享读锁
再使用select 语句后加上lock in share mode;
演示:
这里给id=1的数据加上了记录共享读锁
可以看到现在的锁有表级锁 意向共享锁,记录共享锁
S,REC_NOT_GAP就是 记录共享锁,然后lock_data加锁的行数据
其他事务也可以继续加记录共享锁
现在就有四个锁了 ,也是可以发现意向锁之间可以兼容,而是与共享读表锁和排斥写表锁不兼容
但是不可以加记录排斥锁
加了就阻塞
记录排斥锁
使用更新,删除操作时,还有在select 语句后加for update时就加上记录排斥锁
给id=1的数据加上记录排斥锁
可以发现现有两个锁,意向排他锁,
其他事务要更新这个id=1的数据时会阻塞,因为更新和删除操作都要去加排斥记录锁,但是现在事务a已经给id=1加了排斥记录锁,而排斥记录锁之间不兼容,所以会阻塞。
在事务a中给id=2的数据加上排斥记录锁
就会有两个意向排斥锁,也可以看出来意向锁之间互相兼容
相关文章:

mysql的锁--一篇读懂所有锁机制
目录 mysql的锁 概述:根据mysql锁的大类型可以分为 我们先来讲一下范围最大的全局锁 使用 为什么要使用全局锁? 使用全局锁进行备份的缺点 表级锁 表锁 1.共享读表锁的语法 2.排斥写表锁 元数据锁 意向锁 什么是意向锁 怎么产生意向锁 意向…...

LTC6804、LTC6811、LTC6813的使用
FSEC自制BMS第一步:从零开发使用LTC6804采集电池电压 LTC6811特性 LTC6811 是 LTC6804 的引脚兼容型升级器件,LTC6804官方已经不推荐选用 可测量多达 12 节串联电池 1.2mV 最大总测量误差 可堆叠式架构能支持几百个电池 内置 isoSPI™ 接口 可在 290μ…...

linux内存页块划分及位图存储机制
page_alloc.c - mm/page_alloc.c - Linux source code v5.4.285 - Bootlin Elixir Cross Referencer 一. 什么是页块(Pageblock)? 定义:页块是物理内存中的一个连续区域,由 2^pageblock_order 个物理页(Pag…...
Vue 文件下载功能的跨域处理与前后端实现详解
在 Web 应用开发中,文件下载功能是常见需求。但由于跨域限制和认证机制的复杂性,实际开发中常遇到下载失败或权限错误等问题。本文将结合 Vue 前端和 Spring Boot 后端,详细介绍文件下载功能的实现与跨域问题的解决方案。 一、问题背景 在某…...

boost::beast websocket 实例
环境:ubuntu 1. 安装boost sudo apt install -y libboost-all-dev 2. Server端 #include <boost/asio.hpp> #include <boost/beast.hpp> #include <iostream> #include <thread>namespace beast boost::beast; // 从 Boost.Beast 中导…...

复试难度,西电卓越工程师学院(杭研院)考研录取情况
01、卓越工程师学院各个方向 02、24卓越工程师学院(杭研院)近三年复试分数线对比 PS:卓越工程师学院分为广研院、杭研院 分别有新一代电子信息技术、通信工程、集成电路工程、计算机技术、光学信息工程、网络信息安全、机械,这些…...

Rabbitmq--延迟消息
13.延迟消息 延迟消息:生产者发送消息时指定一个时间,消费者不会立刻收到消息,而是在指定时间之后才会收到消息 延迟任务:一定时间之后才会执行的任务 1.死信交换机 当一个队列中的某条消息满足下列情况之一时,就会…...

cocos creator使用mesh修改图片为圆形,减少使用mask,j减少drawcall,优化性能
cocos creator版本2.4.11 一个mask占用drawcall 3个以上,针对游戏中技能图标,cd,以及多玩家头像,是有很大优化空间 1.上代码,只适合单独图片的,不适合在图集中的图片 const { ccclass, property } cc._decorator;c…...

C++ Qt开发成长之路,从入门到企业级实战项目,保姆级学习路线
Qt 介绍 Qt是一个跨平台的C图形用户界面应用程序开发框架,最初由挪威的Trolltech公司开发,后来被诺基亚收购,现在由Qt公司维护。它提供了丰富的工具和类库,使开发者能够轻松地创建各种类型的应用程序,包括桌面应用、移…...

JavaWeb后端基础(7)AOP
AOP是Spring框架的核心之一,那什么是AOP?AOP:Aspect Oriented Programming(面向切面编程、面向方面编程),其实说白了,面向切面编程就是面向特定方法编程。AOP是一种思想,而在Spring框…...
Uniapp实现地图获取定位功能
摘要:本文将手把手教你如何在Uniapp项目中集成地图功能、实现定位获取,并解决微信小程序、APP、H5三端的兼容性问题🚀🚀🚀 一、环境准备 地图平台选择 微信小程序:腾讯地图(强制使用)…...

批量将 Excel 转换 PDF/Word/CSV以及图片等其它格式
Excel 格式转换是我们工作过程当中非常常见的一个需求,我们通常需要将 Excel 转换为其他各种各样的格式。比如将 Excel 转换为 PDF、比如说将 Excel 转换为 Word、再比如说将 Excel文档转换为图片等等。 这些操作对我们来讲都不难,因为我们通过 Office 都…...
Flutter:StatelessWidget vs StatefulWidget 深度解析
目录 1. 引言 2. StatelessWidget(无状态组件) 2.1 定义与特点 2.2 代码示例 3. StatefulWidget(有状态组件) 3.1 定义与特点 3.2 代码示例 4. StatelessWidget vs StatefulWidget 对比 5. StatefulWidget 生命周期 5.1…...
Stream流学习
Stream流 把数据放进stream流水线,对数据进行一系列操作(中间方法),最后封装(终结方法)。 Stream.of()允许传入任何参数 常见中间方法 可以对数据进行链式(流水线)操作,但…...
多视图几何--恢复相机位姿/内参的几种方法
恢复相机位姿的几种方法 1分解投影矩阵 1.1投影矩阵分解为相机内外参矩阵的完整解析 投影矩阵(Projection Matrix)是计算机视觉中将三维世界点映射到二维像素坐标的核心工具,其本质是相机内参矩阵(Intrinsic Matrix)…...

[数据结构]堆详解
目录 一、堆的概念及结构 二、堆的实现 1.堆的定义 2堆的初始化 3堆的插入 编辑 4.堆的删除 5堆的其他操作 6代码合集 三、堆的应用 (一)堆排序(重点) (二)TOP-K问题 一、堆的概念及结构 堆的…...
领域驱动设计(DDD)与MVC架构:理念对比与架构选择
领域驱动设计(DDD)与MVC架构:理念对比与架构选择 一、架构之争的本质:业务复杂度驱动技术演进 在软件开发领域,没有银弹式的完美架构,只有适合当前业务场景的合理选择。MVC与DDD的区别本质上是业务复杂度与…...
牛客周赛:84:B:JAVA
链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner scanner new Scanner(S…...
【理想解法学习笔记】
目录 理想解法原理简介算法步骤属性值规范化方法代码示例 理想解法 原理简介 TOPSIS(Technique for Order Preference by Simi larity to IdealSolution)法是一种逼近理想解的排序方法。其基本的处理思路是:首先建立初始化决策矩阵,而后基于规范化后的初…...

CI/CD—Jenkins配置一次完整的jar自动化发布流程
背景: 实现设想: 要创建自动化发布,需要准备一台测试服务器提前安装好java运行所需的环境,JDK版本最好和Windows开发机器上的版本一致,在Jenkins上配置将构建好的jar上传到测试服务器上,测试服务器自动启动…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...

什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...

Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...
Python网页自动化Selenium中文文档
1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API,让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API,你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...