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

MySQL并发知识(面试高频)

mysql并发事务解决

不同隔离级别下,mysql解决并发事务的方式不同。主要由锁机制和MVCC(多版本并发控制)机制来解决并发事务问题。

1. mysql中的锁有哪些?

  1. 表级锁

    • 场景:表级锁适用于需要对整个表进行操作的情况,例如在执行DDL语句(如ALTER TABLE)时需要锁定整个表
    • 隔离级别中的使用:表级锁通常在所有隔离级别下都会使用,因为它们可以在需要时锁定整个表,从而防止并发修改。
  2. 行级锁

    • 共享锁(Shared Lock)解决了并发事务 读-读 读-写 问题

      • 场景:共享锁允许多个事务同时读取同一行数据,适用于读取操作。例如,当一个事务读取数据时,可以使用共享锁防止其他事务对数据进行写操作
      • 隔离级别中的使用:共享锁在“读已提交”(Read Committed)及以上的隔离级别使用,以防止其他事务对数据进行不一致的修改。
    • 排他锁(Exclusive Lock)解决了并发事务 写-写 问题

      • 场景:排他锁用于对数据进行写操作,确保在同一时间只有一个事务可以对数据进行修改
      • 隔离级别中的使用:排他锁在所有隔离级别下都会使用,因为它们确保数据在被修改时不会被其他事务修改
  3. 间隙锁(Gap Lock)

    • 场景:间隙锁用于防止并发事务在范围查询中插入新数据,确保数据一致性。
    • 隔离级别中的使用间隙锁主要在“可重复读”(Repeatable Read)隔离级别下使用,以防止其他事务在查询范围内插入新数据,导致幻读问题。
  4. Next-Key Lock

    • 场景:Next-Key Lock可以看作是间隙锁的一个增强版本,结合了行锁和间隙锁的特性,用于防止并发事务在范围查询中插入新数据或修改已有数据,同时也防止幻读问题。
    • 隔离级别中的使用Next-Key Lock也是在“可重复读”(Repeatable Read)隔离级别下使用,与间隙锁一起,用于防止幻读问题的发生

在MySQL中,根据隔离级别的不同,使用的锁也会有所不同,以确保在不同的并发情况下保证数据的一致性和隔离性。

2. MVCC原理

MVCC概念

MySQL中的InnoDB存储引擎利用MVCC(多版本并发控制)来优化并发性能,并确保事务间的隔离性。解决了并发事务 写-读 问题。MVCC允许不同的事务在同一时刻看到数据库的不同版本状态,以此来减少锁定需求,尤其对于读密集型应用而言,可以显著提升并发读取性能。

MVCC核心组件

  1. 隐藏字段

    • 每一行记录除了我们通常定义的列之外,还包含一些隐藏的系统字段:

      • DB_TRX_ID(事务ID): 记录最后一次修改该行记录的事务ID
      • DB_ROLL_PTR(回滚指针): 指向对应的undo日志记录,用于获取该行的前一个版本。
      • DB_ROW_ID(行ID): 在某些情况下作为聚簇索引的补充,用于非唯一二级索引定位记录。
  2. Undo Log (回滚日志)

    • 当事务对数据进行修改时,InnoDB会产生 undo log 记录原来的值,形成版本链。
    • 每次更新操作都会生成一个新的版本,并将旧版本链接到undo log中。
    • Undo日志不仅用于事务回滚,也用于MVCC提供历史版本数据给读事务。
  3. 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的组件化开发中&#xff0c;父子组件间的通信是核心功能之一。本文将详细介绍五种父组件访问子组件属性/方法的实现方案&#xff0c;包含最新的<script setup>语法糖实践。&#xff08;综合1579&#xff09; 一、ref defineExpose&#xff08;推荐方案&#xff0…...

AI时代保护自己的隐私

人工智能最重要的就是数据&#xff0c;让我们面对现实&#xff0c;大多数人都不知道他们每天要向人工智能提供多少数据。你输入的每条聊天记录&#xff0c;你发出的每条语音命令&#xff0c;人工智能生成的每张图片、电子邮件和文本。我建设了一个网站(haptool.com)&#xff0c…...

Android APK组成编译打包流程详解

Android APK&#xff08;Android Package&#xff09;是 Android 应用的安装包文件&#xff0c;其组成和打包流程涉及多个步骤和文件结构。以下是详细的说明&#xff1a; 一、APK 的组成 APK 是一个 ZIP 格式的压缩包&#xff0c;包含应用运行所需的所有文件。解压后主要包含以…...

TCP长连接与短连接

TCP长连接与短连接 TCP&#xff08;传输控制协议&#xff09;中的长连接和短连接是两种不同的连接管理方式&#xff0c;各有优缺点&#xff1a; 短连接 短连接是指客户端与服务器完成一次数据交换后就断开连接。下次需要通信时&#xff0c;再重新建立连接。 特点&#xff1…...

C#委托(delegate)的常用方式

C# 中委托的常用方式&#xff0c;包括委托的定义、实例化、不同的赋值方式以及匿名委托的使用。 委托的定义 // 委托的核心是跟委托的函数结构一样 public delegate string SayHello(string c);public delegate string SayHello(string c);&#xff1a;定义了一个公共委托类型 …...

C#从入门到精通(35)—如何防止winform程序因为误操作被关闭

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

docker本地镜像源搭建

最近Deepseek大火后&#xff0c;接到任务就是帮客户装Dify&#xff0c;每次都头大&#xff0c;因为docker源不能用&#xff0c;实在没办法&#xff0c;只好自己搭要给本地源。话不多说具体如下&#xff1a; 1、更改docker的配置文件&#xff0c;添加自己的私库地址&#xff0c…...

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>关于主题创建 理论…...

技术问题汇总:前端怎么往后端传一个数组?

场景 现在一个专门负责复习算法的服务&#xff0c;筛选出了用户今天需要复习的笔记的ids&#xff0c;现在要调用笔记服务根据ids查询的接口。 请问复习服务怎么将ids发到笔记服务&#xff0c;笔记服务怎么接收。 思路 发的时候肯定是用字符串&#xff0c;接收的时候&#xf…...

【03】STM32F407 HAL 库框架设计学习

【03】STM32F407 HAL 库框架设计学习 摘要 本文旨在为初学者提供一个关于STM32F407微控制器HAL&#xff08;Hardware Abstraction Layer&#xff09;库框架设计的详细学习教程。通过本文&#xff0c;读者将从零开始&#xff0c;逐步掌握STM32F407的基本知识、HAL库的配置步骤…...

智能图像处理平台:图像处理配置类

这里我们先修改一下依赖&#xff0c;不用JavaCV&#xff0c;用openCV。 导入依赖&#xff1a; <!-- JavaCV 依赖&#xff0c;用于图像和视频处理 --> <!-- <dependency>--> <!-- <groupId>org.bytedeco</groupId>--> &l…...

【图文详解】什么是微服务?什么是SpringCloud?

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

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...