MVCC详细介绍及面试题

目录

1.什么是mvcc?

2.问题引入

3. MVCC实现原理?

3.1 隐藏字段

3.2 undo log 日志

3.2.1 undo log版本链

3.3 readview

3.3.1 当前读

​编辑

3.3.2 快照读

3.3.3 ReadView中4个核心字段

3.3.4 版本数据链访问的规则(了解)

4.面试题



前言:mysql中的Redolog日志保证了事务的持久性,Undolog保证了事务的原子性和一致性(回滚)

那事务的隔离性是怎么保证的呢?

答:

1. 锁:排他锁(如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁)

2. mvcc:多版本并发控制

这里主要讲一下mvcc

1.什么是mvcc?

多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突

2.问题引入

下面是一行数据,事务2、3、4都并发的对这行数据进行修改,而事务5要查询两次这行的最新数据,问查询到的是哪一次事务执行到的结果?

如果你看到这里不知道结果,请你继续往下看

3. MVCC实现原理?

MVCC的具体实现,主要依赖于数据库记录中的隐式字段undo log日志readView。      

3.1 隐藏字段

3.2 undo log 日志

回滚日志,在insert、update、delete的时候产生的便于数据回滚的日志。

当insert的时候,产生的undo log日志只在回滚时需要,在事务提交后,可被立即删除。

而update、delete的时候,产生的undo log日志不仅在回滚时需要,mvcc版本访问也需要,不会立即被删除。

3.2.1 undo log版本链

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

下面是事务

3.3 readview

ReadView(读视图)是快照读。是一个事务在执行 快照读(SELECT 等语句) 时生成的,它保存了4个关键字段(3.4.3 有介绍)

3.3.1 当前读

读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。对于我们日常的操作,

如:select ... lock in share mode(共享锁),select ... for update、update、insert、delete(排他锁)都是一种当前读。

3.3.2 快照读

简单的select(不加锁)就是快照读,快照读,读取的是记录数据的可见版本,有可能是历史数据,不加锁,是非阻塞读。

读已提交 RC (Read Committed:每次select,都生成一个快照读。

可重复读 RR (Repeatable Read)(MySQL 的默认隔离级别):开启事务后第一个select语句才是快照读的地方。

3.3.3 ReadView中4个核心字段

ReadView(读取视图) 是一个事务在执行 快照读(SELECT 等语句) 时生成的,它保存了以下关键字段:

还以下面的例子来解释:

事务五第一次查询id为30的记录,此时:

m_ids:当前活跃的事务ID集合是事务三、四、五。因为在事务五第一次查询之前事务二已经提交了(事务执行完毕)。

min_trx_id:最小活跃事务ID是事务三的id为3

max_trx_id:预分配事务ID,当前最大事务ID+1(因为事务ID是自增的),为事务5的id+1是6 

creator_trx_id:ReadView创建者的事务ID ,即为是事务五的id 5

不同的隔离级别,生成ReadView的时机不同:

读已提交 RC READ COMMITTED :在事务中每一次执行快照读时生成ReadView。

可重复读 RRREPEATABLE READ:仅在事务中第一次执行快照读时生成ReadView,后续复用该ReadView。

3.3.4 版本数据链访问的规则(了解)

①. trx_id  == creator_trx_id ? 可以访问该版本

②. trx_id < min_trx_id ? 可以访问该版本

③. trx_id > max_trx_id ?  不可以访问该版本

④. min_trx_id <= trx_id <= max_trx_id ?  如果trx_id不在m_ids中是可以访问该版本的

还以下面5个事务来举例子:

还以事务五第一次查询举例分析可以得到以下结论

上述 ①~④ 是 InnoDB 在使用 MVCC 机制进行快照读(Snapshot Read)时判断一个版本是否可见的规则,目的是为了实现事务隔离性(尤其是可重复读)

核心依据是将数据行上的 trx_id 与当前事务的 ReadView(读取视图)中的一些字段做比较,判断是否可以“看到”这个版本。

详细解释:
①.当前事务的id(未知),等于事务创建者的id(这里是事务五),所以当前事务是事务五,说明当前数据是由“我自己”这个事务修改的。MVCC 当然允许自己看到自己改过的数据(包括未提交的),以确保 读到的是自己操作后的最新快照

②.当前事务的id(未知),小于最小活跃事务ID(这里是事务三),所以当前事务是事务二,而事务二已经提交,

  • 说明这个事务在我生成 ReadView 之前就已经提交了。

  • 因此是 对我“可见”的历史版本数据

③.当前事务的id(未知),大于最大活跃事务ID+1(这里是事务五),所以当前事务是事务六,事务六在此时ReadView 生成时,事务六还没有创建

  • 所以它对我来说是“未来”的数据。

  • 根据事务隔离的原则,我不能看见这个数据版本。

④. min_trx_id <= trx_id <= max_trx_id,这个事务是在我生成 ReadView 时是活跃的(ID 在 min~max 之间),但它不在活跃事务列表 m_ids,说明它已经 提交完成了,因此我可以看见它。和②.表达的意思一样

不同的隔离级别,生成ReadView的时机不同:

读已提交 RC READ COMMITTED :在事务中每一次执行快照读时生成ReadView。

可重复读 RRREPEATABLE READ:仅在事务中第一次执行快照读时生成ReadView,后续复用该ReadView。

举例:

4.面试题

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

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

相关文章

企业级Active Directory架构设计与运维管理白皮书

企业级Active Directory架构设计与运维管理白皮书 第一章 多域架构设计与信任管理 1.1 企业域架构拓扑设计 1.1.1 林架构设计规范 林根域规划原则&#xff1a; 采用三段式域名结构&#xff08;如corp.enterprise.com&#xff09;&#xff0c;避免使用不相关的顶级域名架构主…

android11 DevicePolicyManager浅析

目录 &#x1f4d8; 简单定义 &#x1f4d8;应用启用设备管理者 &#x1f4c2; 文件位置 &#x1f9e0; DevicePolicyManager 功能分类举例 &#x1f6e1;️ 1. 安全策略控制 &#x1f4f7; 2. 控制硬件功能 &#x1f9f0; 3. 应用管理 &#x1f512; 4. 用户管理 &am…

Java学习手册:Java线程安全与同步机制

在Java并发编程中&#xff0c;线程安全和同步机制是确保程序正确性和数据一致性的关键。当多个线程同时访问共享资源时&#xff0c;如果不加以控制&#xff0c;可能会导致数据不一致、竞态条件等问题。本文将深入探讨Java中的线程安全问题以及解决这些问题的同步机制。 线程安…

PyTorch核心函数详解:gather与where的实战指南

PyTorch中的torch.gather和torch.where是处理张量数据的关键工具&#xff0c;前者实现基于索引的灵活数据提取&#xff0c;后者完成条件筛选与动态生成。本文通过典型应用场景和代码演示&#xff0c;深入解析两者的工作原理及使用技巧&#xff0c;帮助开发者提升数据处理的灵活…

声学测温度原理解释

已知声速&#xff0c;就可以得到温度。 不同温度下的胜诉不同。 25度的声速大约346m/s 绝对温度-273度 不同温度下的声速。 FPGA 通过测距雷达测温度&#xff0c;固定测量距离&#xff0c;或者可以测出当前距离。已知距离&#xff0c;然后雷达发出声波到接收到回波的时间&a…

【网络篇】UDP协议的封装分用全过程

大家好呀 我是浪前 今天讲解的是网络篇的第二章&#xff1a;UDP协议的封装分用 我们的协议最开始是OSI七层网络协议 这个OSI 七层网络协议 是计算机的大佬写的&#xff0c;但是这个协议一共有七层&#xff0c;太多了太麻烦了&#xff0c;于是我们就把这个七层网络协议就简化为…

spring-ai-alibaba使用Agent实现智能机票助手

示例目标是使用 Spring AI Alibaba 框架开发一个智能机票助手&#xff0c;它可以帮助消费者完成机票预定、问题解答、机票改签、取消等动作&#xff0c;具体要求为&#xff1a; 基于 AI 大模型与用户对话&#xff0c;理解用户自然语言表达的需求支持多轮连续对话&#xff0c;能…

嵌入式C语言高级编程:OOP封装、TDD测试与防御性编程实践

一、面向对象编程(OOP) 尽管 C 语言并非面向对象编程语言&#xff0c;但借助一些编程技巧&#xff0c;也能实现面向对象编程&#xff08;OOP&#xff09;的核心特性&#xff0c;如封装、继承和多态。 1.1 封装 封装是把数据和操作数据的函数捆绑在一起&#xff0c;对外部隐藏…

蓝桥杯 web 常考到的一些知识点

filter&#xff1a;filter方法创建一个新数组&#xff0c;其包含通过所提供函数实现的测试的所有元素。这个 方法不会改变原数组&#xff0c;而是返回一个新的数组。 map&#xff1a;map方法创建一个新数组&#xff0c;其结果是该数组中的每个元素都调用一个提供的函数后的 返回…

音视频小白系统入门笔记-0

本系列笔记为博主学习李超老师课程的课堂笔记&#xff0c;仅供参阅 音视频小白系统入门课 音视频基础ffmpeg原理 绪论 ffmpeg推流 ffplay/vlc拉流 使用rtmp协议 ffmpeg -i <source_path> -f flv rtmp://<rtmp_server_path> 为什么会推流失败&#xff1f; 默认…

mysql按条件三表并联查询

下面为你呈现一个 MySQL 按条件三表并联查询的示例。假定有三个表&#xff1a;students、courses 和 enrollments&#xff0c;它们的结构和关联如下&#xff1a; students 表&#xff1a;包含学生的基本信息&#xff0c;有 student_id 和 student_name 等字段。courses 表&…

UML之序列图的消息

序列图表现各参与者之间为完成某个行为而发生的交互及其时间顺序&#xff0c;序列图中的交互通过消息实现。消息是从一条生命线到另一条生命线的通信&#xff0c;它们通常是水平或倾斜向下的箭头&#xff0c;从发送方生命线离开&#xff0c;到达接收方生命线。如果需要&#xf…

UniAD:自动驾驶的统一架构 - 创新与挑战并存

引言 自动驾驶技术正经历一场架构革命。传统上&#xff0c;自动驾驶系统采用模块化设计&#xff0c;将感知、预测和规划分离为独立组件。而上海人工智能实验室的OpenDriveLab团队提出的UniAD&#xff08;Unified Autonomous Driving&#xff09;则尝试将这些任务整合到一个统一…

如何写好合同管理系统需求分析

引言 在当今企业数字化转型的浪潮中&#xff0c;合同管理系统作为企业法律合规和商业运营的重要支撑工具&#xff0c;其需求分析的准确性和完整性直接关系到系统建设的成败。本文基于Volere需求过程方法论&#xff0c;结合江铃汽车集团合同管理系统需求规格说明书实践案例&…

libevent服务器附带qt界面开发(附带源码)

本章是入门章节&#xff0c;讲解如何实现一个附带界面的服务器&#xff0c;后续会完善与优化 使用qt编译libevent源码演示视频qt的一些知识 1.主要功能有登录界面 2.基于libevent实现的服务器的业务功能 使用qt编译libevent 下载这个&#xff0c;其他版本也可以 主要是github上…

八、自动化函数

1.元素的定位 web自动化测试的操作核心是能够找到页面对应的元素&#xff0c;然后才能对元素进行具体的操作。 常见的元素定位方式非常多&#xff0c;如id,classname,tagname,xpath,cssSelector 常用的主要由cssSelector和xpath 1.1 cssSelector选择器 选择器的功能&#x…

Web三漏洞学习(其二:sql注入)

靶场&#xff1a;NSSCTF 、云曦历年考核题 二、sql注入 NSSCTF 【SWPUCTF 2021 新生赛】easy_sql 这题虽然之前做过&#xff0c;但为了学习sql&#xff0c;整理一下就再写一次 打开以后是杰哥的界面 注意到html网页标题的名称是 “参数是wllm” 那就传参数值试一试 首先判…

单片机非耦合业务逻辑框架

在小型单片机项目开发初期&#xff0c;由于业务逻辑相对简单&#xff0c;我们往往较少关注程序架构层面的设计。 然而随着项目经验的积累&#xff0c;开发者会逐渐意识到模块间的耦合问题&#xff1a;当功能迭代时&#xff0c;一处修改可能引发连锁反应。 此时&#xff0c;构…

Zookeeper三台服务器三节点集群部署(docker-compose方式)

1. 准备工作 - 服务器:3 台服务器,IP 地址分别为 `10.10.10.11`、`10.10.10.12`、`10.10.10.13`。 - 安装 Docker:确保每台服务器已安装 Docker 和 Docker Compose。 - 网络通信:确保三台服务器之间可以通过 IP 地址互相访问,并开放以下端口: - `2181`:Zookeeper 客户…

Mac关闭sip方法

Mac关闭sip方法 导航 文章目录 Mac关闭sip方法导航完整操作流程图详细步骤 完整操作流程图 这东西是我在网上搬运下来的&#xff0c;但是我在为业务实操过程中&#xff0c;根据实操情况还是有新的注意点的 详细步骤 1.在「关于本机」-「系统报告」-「软件」;查看SIP是否开启…