面试篇-Mysql-2+事务隔离级别的实现

文章目录

  • 前言
  • 一、Mysql 的事务你了解吗
  • 二、你了解Mysql 的事务隔离级别吗:
    • 2.1 你知道Mysql 的脏读,不可重复读,幻读的问题吗:
      • 2.1.1 脏读:
      • 2.1.2 不可重复读:
      • 2.1.3 幻读:
    • 2.2 对于并发场景下的脏读,不可重复读,幻读的情况,Mysql 是怎么解决的
  • 三、Mysql 的一条sql 语句执行的过程了解过吗,Mysql 会有数据丢失吗
    • 3.1 一条update 语句的执行:
    • 3.2 你知道redolog 日志的作用吗:
    • 3.2 你知道undolog 日志的作用吗:
    • 3.3 说下 undolog和redolog的区别
  • 三、Mysql 的事务是通过什么实现的
    • 3.1 你了解Mvcc 多版本并发控制吗
    • 3.2 Mvcc 的实现原理
      • 3.2.1 表中每行数据的额外字段
      • 3.2.2 你知道 undolog 版本链吗
        • 3.2.2.1 undolog是用来干嘛的
        • 3.2.2.2 undolog 版本链
      • 3.2.3 你知道readView 吗
      • 3.2.4 你知道readView 读取undolog 的规则吗
        • 3.2.4.1 Rc级别的可见性
        • 3.2.4.2 RR级别的可见性
    • 3.3 你来解释下什么是Mvcc
  • 总结


前言

你知道Mysql 的事务,事务底层的实现原理你知道吗,Spring 是怎么支持事务的。本文重点对面试的问题进行介绍,祝愿每位程序员都能上岸!!!


一、Mysql 的事务你了解吗

事务是一个操作的集合,它是一个不可分割的单位,作为一个整体向系统提交,要么同时成功,要么同时失败。

事务的ACID 特性:

  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
  • 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
  • 隔离性(lsolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。:
  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

二、你了解Mysql 的事务隔离级别吗:

2.1 你知道Mysql 的脏读,不可重复读,幻读的问题吗:

在并发的情景下,Mysql 会出现脏读,不可重复读,幻读的问题,这些问题是怎么产生的;

2.1.1 脏读:

个事务读到另外一个事务还没有提交的数据。
在这里插入图片描述

2.1.2 不可重复读:

一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读,不可重复读针对的是update 的场景。
在这里插入图片描述

2.1.3 幻读:

一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了幻影”,幻读针对的是insert 的场景。
在这里插入图片描述

2.2 对于并发场景下的脏读,不可重复读,幻读的情况,Mysql 是怎么解决的

mysql 提供了4中事物的隔离级别,来对不同的场景进行处理
在这里插入图片描述隔离级别解决的问题:

  • READ UNCOMMITTED 未提交读 会出现:脏读、不可重复读、幻读
  • READ COMMITTED 读已提交 会出现: 不可重复读、幻读
  • REPEATABLE READ 可重复读,会出现: 幻读
  • SERIALIZABLE 串行化

三、Mysql 的一条sql 语句执行的过程了解过吗,Mysql 会有数据丢失吗

3.1 一条update 语句的执行:

比如一条update sql 语句的执行流程,他是怎么将数据库中中的数据更新的;

在这里插入图片描述缓冲池和数据页:
在这里插入图片描述

Mysql 并不是直接修改表中的数据,它是有一个加载的过程:

  • 首先,要想操作数据,需要存储引擎向将数据按页加载到 pool buffer 中,如:修改一条数据,需要搜索引擎先将要修改的数据加载到数据页中;
  • 其次,数据的修改是在数据页中完成的,因为数据页pool buffer 是内存,断电会丢失,就需要有个地方进行数据的记录;
  • 然后,记录redolog 日志方式数据丢失,二阶段提交记录数据 为prepare;
  • 随后,记录binlog dml 语句;
  • 提交事务;
  • 最后,将redolog 数据标记为commit

3.2 你知道redolog 日志的作用吗:

重做日志,记录的是事务提交时数据页的物理修改,是用来实现事务的持久性该日志文件由两部分组成:重做日志缓冲(redolog buffer)以及重做日志文件(redolog file),前者是在内存中,后者在磁盘中。当事务提交之后会把所有修改信息都存到该日志文件中,用于在刷新脏页到磁盘,发生错误时,进行数据恢复使用。
在这里插入图片描述

3.2 你知道undolog 日志的作用吗:

undolog回滚日志,用于记录数据被修改前的信息,作用包含两个:提供回滚和 MVCC(多版本并发控制)。undolog和redoloq记录物理日志不一样,它是逻辑日志。

  • 可以认为当delete一条记录时,undolog中会记录一条对应的insert记录,反之亦然;
  • 当update一条记录时,它记录一条对应相反的update记录。当执行rollback时,就可以从undo log中的逻辑记录读取到相应的内容并进行回滚。
  • undo log可以实现事务的一致性和原子性

3.3 说下 undolog和redolog的区别

  • redo log: 记录的是数据页的物理变化,服务宕机可用来同步数据
  • undo log:记录的是逻辑日志,当事务回滚时,通过逆操作恢复原来的数据
  • redo log保证了事务的持久性,undolog保证了事务的原子性和一致性

三、Mysql 的事务是通过什么实现的

Mysql 提供了四种的事务隔离级别,它的底层是通过Mvcc + 锁来实现的

3.1 你了解Mvcc 多版本并发控制吗

全称 Multi-Version Concurrency Control,多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突MVCC的具体实现,主要依赖于数据库记录中的隐式字段、undo loq日志、readView。
在这里插入图片描述

3.2 Mvcc 的实现原理

对于表中的每行数据,都提供了额外隐藏的字段,隐藏字段和undolog版本链以及readView共同作用实现mvcc

3.2.1 表中每行数据的额外字段

在这里插入图片描述

  • DB_TRX_ID 最近修改事务ID,记录插入这条记录或最后一次修改该记录的事务ID。
  • DB ROLL PTR 回滚指针,指向这条记录的上一一个版本,用于配合undolog,指向上一个版本。
  • DB_ROW_ID 隐藏主键,如果表结构没有指定主键,将会生成该隐藏字段。

3.2.2 你知道 undolog 版本链吗

3.2.2.1 undolog是用来干嘛的
  • 回滚日志,在insert、update、delete的时候产生的便于数据回滚的日志。
  • 当insert的时候,产生的undo log日志只在回滚时需要,在事务提交后,可被立即删除。
  • 而update、delete的时候,产生的undo log日志不仅在回滚时需要,mvcc版本访问也需要,不会立即被删除,
3.2.2.2 undolog 版本链

不同事务或相同事务对同一条记录进行修改,会导致该记录的undolog生成一条记录版本链表,链表的头部是最新的旧记录,链表尾部是最早的旧记录。
在这里插入图片描述

3.2.3 你知道readView 吗

ReadView(读视图)是 快照读 SQL执行时MVCC提取数据的依据,记录并维护系统当前活跃的事务(未提交的)id,它根据当前事务的隔离级别 ,计算得到对当前线程可见的undolog 版本数据 。
在这里插入图片描述

readView 数据结构核心字段
在这里插入图片描述

3.2.4 你知道readView 读取undolog 的规则吗

根据不同的隔离级别,然后读取的规则不同
在这里插入图片描述

3.2.4.1 Rc级别的可见性

事务中每次进行查询,都生成新的readView 视图
在这里插入图片描述

3.2.4.2 RR级别的可见性

在这里插入图片描述

3.3 你来解释下什么是Mvcc

  • 其中mvcc的意思是多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突,它的底层实现主要是分为了三个部分,第一个是隐藏字段,第二个是undolog日志,第三个是readView读视图;
  • 隐藏字段是指:在mysgl!中给每个表都设置了隐藏字段,有一个是tx_id(事务id),记录每一次操作的事务id,是自增的;另一个字段是roll-pointer(回滚指针),指向上一个版本的事务版本记录地址
  • undolog主要的作用是记录回滚日志,存储老版本数据,在内部会形成一个版本链,在多个事务并行操作某一行记录,记录不同事务修改数据的版本,通过roll_pointer指针形成一个链表
  • readView解决的是一个事务查询选择版本的问题,在内部定义了一些匹配规则和当前的一些事务id判断该访问那个版本的数据,不同的隔离级别快照读是不一样的,最终的访问的结果不一样。如果是rc隔离级别,每一次执行快照读时生成ReadView,如果是rr隔离级别仅在事务中第一次执行快照读时生成ReadView,后续复用;

总结

本文对Mysql 事务以及隔离级别的实现面试题,进行介绍。

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

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

相关文章

Python使用策略模式和openpyxl库创建Excel文件并追加内容

from openpyxl import load_workbook# 数据数组 data [[1, 2, 3],[4, 5, 6],[7, 8, 9] ]# 打开现有的 Excel 文件 excel_file sheetApend_example.xlsx wb load_workbook(excel_file)# 选择要追加数据的工作表 sheet_name test_Sheet2 # 指定要追加数据的工作表名称 sheet…

用虚拟机,可以在x86的电脑上虚拟出arm的电脑吗

1.用虚拟机,可以在x86的电脑上虚拟出arm的电脑吗 是的,可以在x86的电脑上使用虚拟机技术虚拟出ARM架构的电脑。以下是通过虚拟机实现x86电脑上虚拟ARM电脑的几个关键步骤: 选择合适的虚拟化软件:通常,你可以使用如QE…

AI Agent满级进化!骑马种田、办公修图,样样精通,昆仑万维等发布通用Agent新框架

【导读】智能体又双叒叕进化了!这次,什么游戏都能玩,什么软件都能操控了。 近日,昆仑万维携手北京智源人工智能研究院、新加坡南洋理工大学、北京大学等顶尖名校机构,联合提出了迄今为止第一个既能玩多种商业游戏又能…

Excel的Index+MATCH组合使用方法

INDEX函数 INDEX函数作用:用于从指定的单元格区域中返回特定行和列的值。 参数形式为:INDEX(array, row_num, [column_num]) array:必需。单元格区域或数组常量。 row_num:必需。要返回的值所在的行号。 [column_num]&#x…

【算法】【二分法】二分法详解

先给y总打一个广告。(我这种废物收不到钱) 本科时候就在打蓝桥杯玩玩算法,当时听朋友的一个刷题且涵盖教程的网站,ACWING。 www.acwing.com 里面好处是大部分基础算法都有,Y总的视频! y总我的神&#xff01…

LLMs 入门实战系列

【LLMs 入门实战系列】 第一层 LLMs to Natural Language Processing (NLP) 第一重 ChatGLM-6B 【ChatGLM-6B入门-一】清华大学开源中文版ChatGLM-6B模型学习与实战 介绍:ChatGLM-6B 环境配置 和 部署 【ChatGLM-6B入门-二】清华大学开源中文版ChatGLM-6B模型微调…

行为模式9.策略模式------促销活动设计方案

行为型模式 模板方法模式(Template Method Pattern)命令模式(Command Pattern)迭代器模式(Iterator Pattern)观察者模式(Observer Pattern)中介者模式(Mediator Pattern…

Rust入门实战 编写Minecraft启动器#5启动游戏

首发于Enaium的个人博客 好了,我们已经完成了所有的准备工作,现在我们可以开始编写启动游戏的代码了。 首先我们需要添加几个依赖。 model { path "../model" } parse { path "../parse" } download { path "../downlo…

ensp防火墙综合实验作业+实验报告

实验目的要求及拓扑图: 我的拓扑: 更改防火墙和交换机: [USG6000V1-GigabitEthernet0/0/0]ip address 192.168.110.5 24 [USG6000V1-GigabitEthernet0/0/0]service-manage all permit [Huawei]vlan batch 10 20 [Huawei]int g0/0/2 [Huawei-…

python 端口的转发

实现端口的转发 tcpsocket.py 对基础的socket进行了封装 import socketclass baseSocket:def service(host:str,port:int,maxSuspend:int)->socket: service_socket socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 创建 socket 对象service_socket.setso…

GPT的架构与应用 - Transformer教程

在过去的几年里,人工智能技术取得了巨大的进展,其中最引人注目的成就是生成式预训练变换器(GPT)的出现。GPT是一种基于Transformer架构的模型,已在自然语言处理(NLP)领域掀起了革命性变化。今天…

springboot vue 实现验证码

要在Spring Boot和Vue.js中实现验证码功能&#xff0c;可以按照以下步骤进行操作&#xff1a; 在Spring Boot项目中添加验证码相关的依赖。可以使用Google的Kaptcha库来生成验证码图片。在pom.xml中添加以下依赖&#xff1a; <dependency><groupId>com.github.pe…

安全开发--多语言基础知识

注释&#xff1a;还是要特别说明一下&#xff0c;想成为专业开发者不要看本文&#xff0c;本文是自己从业安全以来的一些经验总结&#xff0c;所有知识点也只限于网络安全这点事儿&#xff0c;再多搞不明白了。 开发语言 笼统的按照是否编译成机器码分类开发语言&#xff0c;…

Perl 语言开发(十二):面向对象编程,深入理解与实践

目录 1. 概述 2. 面向对象编程基础 2.1 类与对象的基本概念 3. Perl中的面向对象编程 3.1 定义类和对象 3.1.1 创建类 3.1.2 创建对象 3.2.1 访问器和修改器 3.3 继承 3.3.1 创建基类 3.3.2 创建子类 3.3.3 使用继承 3.4 多态 3.4.1 方法重写 3.4.2 动态绑定 4…

git常用命令及git分支

git常用命令及git分支 git常用命令设置用户签名初始化本地库查看本地库状态将文件添加到暂存区提交到本地库查看历史记录版本穿梭 git分支什么是分支分支的好处分支的操作查看分支创建分支切换分支合并分支合并冲突 git常用命令 设置用户签名 //设置用户签名 git config --gl…

linux-conda环境安装教程

Linux Conda 环境安装教程 本文档详细介绍了在 Linux 系统上安装和使用 Conda 环境的步骤。 1. 安装 Conda 1.1 下载 Anaconda 安装包 首先&#xff0c;访问 Anaconda 官方网站 并下载适用于 Linux 系统的 Anaconda 安装包。 或者使用以下命令直接从终端下载&#xff1a; …

Datawhale 2024 年 AI 夏令营第二期——基于术语词典干预的机器翻译挑战赛

#AI夏令营 #Datawhale #夏令营 1.赛事简介 目前神经机器翻译技术已经取得了很大的突破&#xff0c;但在特定领域或行业中&#xff0c;由于机器翻译难以保证术语的一致性&#xff0c;导致翻译效果还不够理想。对于术语名词、人名地名等机器翻译不准确的结果&#xff0c;可以通…

emqx 负载均衡配置 HAProxy 健康检查 轮询 haship

HAProxy配置文件 配置文件&#xff1a; /etc/haproxy/haproxy.cfg 负载均衡参数&#xff1a; 轮询方式轮询注解roundrobin基于权重进行轮叫调度的算法&#xff0c;在服务器的性能分布比较均匀时&#xff0c;这是一种最公平合理&#xff0c;常用的算法。此算法使用较为频…

【银河麒麟高级服务器操作系统】数据中心系统异常卡死分析处理建议

了解银河麒麟操作系统更多全新产品&#xff0c;请点击访问&#xff1a;https://product.kylinos.cn 1.服务器环境以及配置 【机型】浪潮NF5280M5 处理器&#xff1a; Intel 内存&#xff1a; 1T 【内核版本】 4.19.90-24.4.v2101.ky10.x86_64 【OS镜像版本】 银河麒麟…

PDF 中图表的解析探究

PDF 中图表的解析探究 0. 引言1. 开源方案探究 0. 引言 一直以来&#xff0c;对文档中的图片和表格处理都非常有挑战性。这篇文章记录一下最近工作上在这块的探究。图表分为图片和表格&#xff0c;这篇文章主要记录了对表格的探究。还有&#xff0c;我个人主要做日本项目&…