MySQL并发知识(面试高频)
mysql并发事务解决
不同隔离级别下,mysql解决并发事务的方式不同。主要由锁机制和MVCC(多版本并发控制)机制来解决并发事务问题。
1. mysql中的锁有哪些?
-
表级锁:
- 场景:表级锁适用于需要对整个表进行操作的情况,例如在执行DDL语句(如
ALTER TABLE
)时需要锁定整个表。 - 隔离级别中的使用:表级锁通常在所有隔离级别下都会使用,因为它们可以在需要时锁定整个表,从而防止并发修改。
- 场景:表级锁适用于需要对整个表进行操作的情况,例如在执行DDL语句(如
-
行级锁:
-
共享锁(Shared Lock) :解决了并发事务 读-读 读-写 问题
- 场景:共享锁允许多个事务同时读取同一行数据,适用于读取操作。例如,当一个事务读取数据时,可以使用共享锁防止其他事务对数据进行写操作。
- 隔离级别中的使用:共享锁在“读已提交”(Read Committed)及以上的隔离级别使用,以防止其他事务对数据进行不一致的修改。
-
排他锁(Exclusive Lock) :解决了并发事务 写-写 问题
- 场景:排他锁用于对数据进行写操作,确保在同一时间只有一个事务可以对数据进行修改。
- 隔离级别中的使用:排他锁在所有隔离级别下都会使用,因为它们确保数据在被修改时不会被其他事务修改。
-
-
间隙锁(Gap Lock) :
- 场景:间隙锁用于防止并发事务在范围查询中插入新数据,确保数据一致性。
- 隔离级别中的使用:间隙锁主要在“可重复读”(Repeatable Read)隔离级别下使用,以防止其他事务在查询范围内插入新数据,导致幻读问题。
-
Next-Key Lock:
- 场景:Next-Key Lock可以看作是间隙锁的一个增强版本,结合了行锁和间隙锁的特性,用于防止并发事务在范围查询中插入新数据或修改已有数据,同时也防止幻读问题。
- 隔离级别中的使用:Next-Key Lock也是在“可重复读”(Repeatable Read)隔离级别下使用,与间隙锁一起,用于防止幻读问题的发生。
在MySQL中,根据隔离级别的不同,使用的锁也会有所不同,以确保在不同的并发情况下保证数据的一致性和隔离性。
2. MVCC原理
MVCC概念
MySQL中的InnoDB存储引擎利用MVCC(多版本并发控制)来优化并发性能,并确保事务间的隔离性。解决了并发事务 写-读 问题。MVCC允许不同的事务在同一时刻看到数据库的不同版本状态,以此来减少锁定需求,尤其对于读密集型应用而言,可以显著提升并发读取性能。
MVCC核心组件
-
隐藏字段
-
每一行记录除了我们通常定义的列之外,还包含一些隐藏的系统字段:
- DB_TRX_ID(事务ID): 记录最后一次修改该行记录的事务ID。
- DB_ROLL_PTR(回滚指针): 指向对应的undo日志记录,用于获取该行的前一个版本。
- DB_ROW_ID(行ID): 在某些情况下作为聚簇索引的补充,用于非唯一二级索引定位记录。
-
-
Undo Log (回滚日志)
- 当事务对数据进行修改时,InnoDB会产生 undo log 记录原来的值,形成版本链。
- 每次更新操作都会生成一个新的版本,并将旧版本链接到undo log中。
- Undo日志不仅用于事务回滚,也用于MVCC提供历史版本数据给读事务。
-
Read View (一致性读视图)
-
在开启事务时,InnoDB会创建一个Read View用来确定事务执行过程中哪些版本的数据对它是可见的。
-
Read View包含了以下关键信息:
- m_ids: 当前系统中活跃事务的最小和最大事务ID。
- active_trx_list: 活跃事务列表,这些事务可能修改了数据但还未提交。
- 创建Read View时系统全局事务ID计数器的值。
-
MVCC的工作原理
MVCC是“维持一个数据的多个版本,使读写操作没有冲突”的一个抽象概念
。 这个概念需要具体功能去实现,这个具体实现就是快照读
。
-
快照读:在可重复读(Repeatable Read)隔离级别下,普通的
SELECT
语句不会加锁而是采用一致性读(快照读),根据当前事务的Read View来读取创建视图时刻之前已经提交的数据版本。-
根据以下规则判断某行记录对于当前事务是否可见:
- 如果DB_TRX_ID小于Read View的最低事务ID(min trx id),表示该行在Read View创建前就已经提交,因此是可见的。
- 如果DB_TRX_ID大于或等于Read View的最低事务ID,但不在活跃事务列表中,同样视为已提交且可见。
- 若DB_TRX_ID大于或等于Read View的最低事务ID且在活跃事务列表中,说明是未提交事务更改的数据,不可见。InnoDB会查询undo log中的历史版本数据,直到找到最接近的已提交数据版本,将其提供给当前事务使用。
- 若DB_TRX_ID等于当前事务的事务ID,表示是当前事务自己修改的数据,也是可见的。
-
-
事务结束时的清理:
- 当事务提交时,其修改过的记录的旧版本可以在适当的时机被purge线程清除,以回收存储空间。
- 已经不再被任何事务使用的旧版本数据会被从undo日志中移除。
通过上述机制,MVCC能够在很大程度上降低事务之间的互斥,提高并发性能,同时保证事务的ACID特性(原子性、一致性、隔离性和持久性)。在实际应用中,尤其是在高并发的OLTP系统中,MVCC是保证数据库高性能并发处理的重要手段。
MVCC机制生效条件
MVCC机制只在读已提交和可重复读隔离级别下才会生效。
- 读已提交(READ COMMITTED) : 在这个隔离级别下,每次
SELECT
语句执行时,都会获取最新的已提交数据,这意味着每次查询都可能看到不同的数据版本,因为每次查询都会获取一个最新的快照。然而,与Repeatable Read相比,这里的“快照”并不是事务开始时固定的视图,而是每次查询时动态获取的。 - 可重复读(REPEATABLE READ) : 这是MySQL InnoDB存储引擎的默认事务隔离级别。在这个级别下,同一个事务内的普通
SELECT
语句确实不会加锁,而是始终读取事务启动时存在的已提交数据版本,也就是说,同一个事务内多次执行相同的SELECT
语句结果总是相同的,不会受到其他事务提交的影响。
总结来说,所谓的MVCC指的就是在使用READ COMMITTD、REPEATABLE READ这两种隔离级别的事务在执行普通的SEELCT操作时访问记录的版本链的过程,这样子可以使不同事务的读-写、写-读操作并发执行,从而提升系统性能。
相关文章:
MySQL并发知识(面试高频)
mysql并发事务解决 不同隔离级别下,mysql解决并发事务的方式不同。主要由锁机制和MVCC(多版本并发控制)机制来解决并发事务问题。 1. mysql中的锁有哪些? 表级锁: 场景:表级锁适用于需要对整个表进行操作的情况,例如…...
现存脑容知识库
Redis import queue import threading import asyncio 异步:在一个线程内,等待的时候可以切换到其他任务。 多线程:每个线程独立运行,同时处理多个任务。 回调函数 网络请求(JavaScript)在浏览器中&a…...

Mysql-如何理解事务?
一、事务是什么东西 有些场景中,某个操作需要多个sql配合完成: 例如: 李四这个月剩下的前不够交房租了,找张三借1000元急用: (1)给张三的账户余额 减去1000元 updata 账户表 set money money -…...

dify绑定飞书多维表格
dify 绑定飞书和绑定 notion 有差不多的过程,都需要套一层应用的壳子,而没有直接可以访问飞书文档的 API。本文记录如何在dify工具中使用新增多条记录工具。 创建飞书应用 在飞书开放平台创建一个应用,个人用户创建企业自建应用。 自定义应…...

QT播放视频保持视频宽高比消除黑边
QT播放视频保持视频宽高比消除黑边 1、问题 在播放视频的时候,由于框架的大小发生变化,导致视频出现黑边很不好看。 因此需要像一种方法消除黑边 2、处理 1、读取视频的宽高比 2、设置视频的Widget的大小固定,Widget的宽高比和视频宽高比…...
1. IO的基础知识
1.1 流 Java程序通过流执行IO。流是一种抽象,它要么生成信息,要么使用信息。流通过java的IO系统链接到物理设备。所有流的行为方式都是相同的,尽管它们链接的物理设备是不同的。 1.2 字节流和字符流 Java定义了两种类型的流 : 字节流和字符流…...
科普:ROC AUC与PR AUC
在评价二分类模型性能时,有许多评价指标,其中,有一对是用面积AUC(Area Under the Curve)做评价的:ROC AUC与PR AUC 本文我们对ROC AUC与PR AUC进行多维度对比分析: 一、定义与核心原理 维度RO…...
Vue3父组件访问子组件方法与属性完全指南
在Vue3的组件化开发中,父子组件间的通信是核心功能之一。本文将详细介绍五种父组件访问子组件属性/方法的实现方案,包含最新的<script setup>语法糖实践。(综合1579) 一、ref defineExpose(推荐方案࿰…...
AI时代保护自己的隐私
人工智能最重要的就是数据,让我们面对现实,大多数人都不知道他们每天要向人工智能提供多少数据。你输入的每条聊天记录,你发出的每条语音命令,人工智能生成的每张图片、电子邮件和文本。我建设了一个网站(haptool.com),…...

Android APK组成编译打包流程详解
Android APK(Android Package)是 Android 应用的安装包文件,其组成和打包流程涉及多个步骤和文件结构。以下是详细的说明: 一、APK 的组成 APK 是一个 ZIP 格式的压缩包,包含应用运行所需的所有文件。解压后主要包含以…...
TCP长连接与短连接
TCP长连接与短连接 TCP(传输控制协议)中的长连接和短连接是两种不同的连接管理方式,各有优缺点: 短连接 短连接是指客户端与服务器完成一次数据交换后就断开连接。下次需要通信时,再重新建立连接。 特点࿱…...
C#委托(delegate)的常用方式
C# 中委托的常用方式,包括委托的定义、实例化、不同的赋值方式以及匿名委托的使用。 委托的定义 // 委托的核心是跟委托的函数结构一样 public delegate string SayHello(string c);public delegate string SayHello(string c);:定义了一个公共委托类型 …...

C#从入门到精通(35)—如何防止winform程序因为误操作被关闭
前言: 大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任软件经理,从事C#上位机软件开发8年以上!我们在开发的上位机软件运行起来以后,一般在右上角都有一个关闭按钮,正常情况下点击关闭按钮就能关闭软件,但是不排除我们不想关闭软件,但是因为不…...

docker本地镜像源搭建
最近Deepseek大火后,接到任务就是帮客户装Dify,每次都头大,因为docker源不能用,实在没办法,只好自己搭要给本地源。话不多说具体如下: 1、更改docker的配置文件,添加自己的私库地址,…...
Sqlserver安全篇之_TLS的证书概念
证书的理解 参考Sqlserver的官方文档https://learn.microsoft.com/zh-cn/sql/database-engine/configure-windows/certificate-overview?viewsql-server-ver16 TLS(Transport Layer Security)传输层安全和SSL(Secure Sockets Layer)安全套接字层协议位于应用程序协议层和TCP/…...

Kafka生产者相关
windows中kafka集群部署示例-CSDN博客 先启动集群或者单机也OK 引入依赖 <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>3.9.0</version></dependency>关于主题创建 理论…...
技术问题汇总:前端怎么往后端传一个数组?
场景 现在一个专门负责复习算法的服务,筛选出了用户今天需要复习的笔记的ids,现在要调用笔记服务根据ids查询的接口。 请问复习服务怎么将ids发到笔记服务,笔记服务怎么接收。 思路 发的时候肯定是用字符串,接收的时候…...
【03】STM32F407 HAL 库框架设计学习
【03】STM32F407 HAL 库框架设计学习 摘要 本文旨在为初学者提供一个关于STM32F407微控制器HAL(Hardware Abstraction Layer)库框架设计的详细学习教程。通过本文,读者将从零开始,逐步掌握STM32F407的基本知识、HAL库的配置步骤…...

智能图像处理平台:图像处理配置类
这里我们先修改一下依赖,不用JavaCV,用openCV。 导入依赖: <!-- JavaCV 依赖,用于图像和视频处理 --> <!-- <dependency>--> <!-- <groupId>org.bytedeco</groupId>--> &l…...

【图文详解】什么是微服务?什么是SpringCloud?
目录 一.认识微服务架构 ??微服务带来的挑战 二.微服务解决方案SpringCloud ??SpringCloud的版本 ??SpringCloud和SpringBoot的关系 ??SpringCloud实现方案 Spring Cloud Netfix Spring Cloud Alibaba ??Spring Cloud 实现对比 在入门Spring Cloud 之前&…...

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...