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上传到测试服务器上,测试服务器自动启动…...

Magento2根据图片文件包导入产品图片
图片包给的图片文件是子产品的图片,如下图:A104255是主产品的sku <?php/*** 根据图片包导入产品图片,包含子产品和主产品* 子产品是作为主图,主产品是作为附加图片*/use Magento\Framework\App\Bootstrap;include(../app/boot…...

从零开始的python学习(五)P71+P72+P73+P74
本文章记录观看B站python教程学习笔记和实践感悟,视频链接:【花了2万多买的Python教程全套,现在分享给大家,入门到精通(Python全栈开发教程)】 https://www.bilibili.com/video/BV1wD4y1o7AS/?p6&share_sourcecopy_web&v…...

OpenHarmony5.0分布式系统源码实现分析—软总线
一、引言 OpenHarmony 作为一款面向万物互联的操作系统,其分布式软总线(Distributed SoftBus)是实现设备间高效通信和协同的核心技术之一。分布式软总线通过构建一个虚拟的总线网络,使得不同设备能够无缝连接、通信和协同工作。本…...

基于SpringBoot实现旅游酒店平台功能六
一、前言介绍: 1.1 项目摘要 随着社会的快速发展和人民生活水平的不断提高,旅游已经成为人们休闲娱乐的重要方式之一。人们越来越注重生活的品质和精神文化的追求,旅游需求呈现出爆发式增长。这种增长不仅体现在旅游人数的增加上࿰…...

代码随想录算法训练营第六十一天 | 108. 冗余连接 109. 冗余连接II
108. 冗余连接 题目链接:KamaCoder 文档讲解:代码随想录 状态:AC Java代码: import java.util.*;class Main {public static int[] father;public static void main(String[] args) {Scanner scan new Scanner(System.in);int n…...

RoboVQA:机器人多模态长范围推理
23 年 11 月来自 Google Deepmind 的论文“RoboVQA: Multimodal Long-Horizon Reasoning for Robotics”。 本文提出一种可扩展、自下而上且本质多样化的数据收集方案,该方案可用于长期和中期的高级推理,与传统的狭窄自上而下的逐步收集相比,…...

TCP/IP原理详细解析
前言 TCP/IP是一种面向连接,可靠的传输,传输数据大小无限制的。通常情况下,系统与系统之间的http连接需要三次握手和四次挥手,这个执行过程会产生等待时间。这方面在日常开发时需要注意一下。 TCP/IP 是互联网的核心协议族&…...

Microsof Visual Studio Code 安装教程(中文设置)
VS Code 是一个免费的代码编辑器,可在 macOS、Linux 和 Windows作系统上运行。启动和运行 VS Code 既快速又简单。VS Code(全称 Visual Studio Code)是一款由Microsoft 推出的免费、开源、跨平台的代码编辑器,拥有强大的功能和灵活…...

python爬虫:Android自动化工具Auto.js的详细使用
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 1. Auto.js 简介2. 安装与配置2.1 安装 Auto.js2.2 安装 Python 环境2.3 安装 ADB 工具3. Python 与 Auto.js 结合3.1 通过 ADB 执行 Auto.js 脚本3.2 通过 Python 控制 Auto.js3.3 通过 Python 与 Auto.js 交互4. 常用…...

Unity DOTS从入门到精通之 自定义Authoring类
文章目录 前言安装 DOTS 包什么是Authoring1. 实体组件2. Authoring类 前言 DOTS(面向数据的技术堆栈)是一套由 Unity 提供支持的技术,用于提供高性能游戏开发解决方案,特别适合需要处理大量数据的游戏,例如大型开放世…...