高级java每日一道面试题-2024年10月6日-数据库篇-MVCC是什么? 它的底层原理是什么?

如果有遗漏,评论区告诉我进行补充

面试官: MVCC是什么? 它的底层原理是什么?

我回答:

多版本并发控制(Multi-Version Concurrency Control, MVCC)是一种用于数据库管理系统中的并发控制方法。MVCC 通过为每个事务提供数据的不同版本,允许多个事务同时访问同一数据的不同版本,从而提高了系统的并发性能和可扩展性。这种机制特别适用于读多写少的场景。

MVCC 的基本概念

  • 事务:在数据库中,事务是一组操作的集合,这些操作要么全部成功执行,要么全部不执行。
  • 版本:每个数据项都有多个版本,每个版本对应一个特定的时间点或事务。
  • 快照:事务开始时会创建一个数据的快照,这个快照包含了事务开始时的数据状态。

MVCC 的底层原理

1. 版本链
  • 每个数据行都有一个隐藏的版本链字段,记录了该行的所有历史版本。
  • 版本链中的每个节点包含:
    • 事务ID:生成该版本的事务ID。
    • 回滚指针:指向该行的上一个版本。
    • 其他元数据:如删除标记等。
2. 事务ID
  • 每个事务在启动时会被分配一个唯一的事务ID(Transaction ID),通常是一个递增的整数。
  • 事务ID用于标识事务的顺序和版本。
3. 读取可见性规则
  • 读未提交(Read Uncommitted):事务可以看到所有版本的数据,包括未提交的数据。这种情况很少使用,因为可能会导致脏读。
  • 读已提交(Read Committed):事务只能看到已经提交的数据。对于当前事务来说,每次读取都会获取最新的已提交数据。
  • 可重复读(Repeatable Read):事务在第一次读取数据后,后续的读取操作会看到相同的数据版本,即使其他事务已经修改并提交了数据。
  • 串行化(Serializable):事务之间完全隔离,不允许并发读写操作。这是最严格的隔离级别,但性能最低。

读操作

  • 读操作只读取符合时间条件或事务ID条件的版本。在读取数据时,事务只能看到创建时间早于事务开始时间的版本,或者只能看到在事务开始之前已经提交的事务所修改的版本。这样可以保证事务读取的数据是一致的,不会受到其他未提交事务的影响。
  • 快照读:指读取的数据版本是在事务开始时已经存在的数据版本,而不是最新的数据版本。这种读取方式提供了事务在执行期间看到的数据视图的一致性。
4. 写入操作
  • 当事务对某一行进行更新或删除操作时,InnoDB 会在版本链中创建一个新的版本,并将旧版本通过回滚指针链接起来。
  • 更新操作会将旧版本标记为“删除”,但不会立即物理删除,而是保留在版本链中,以便其他事务可以读取到旧版本。

写操作

  • 写操作会创建新的版本,并更新相关记录的版本号或时间戳。旧的版本仍然存在,不会被删除。这样做的好处是,其他正在进行的事务可以继续读取到旧的版本,不会被阻塞。
  • 当前读:指读取最新的数据版本,通常涉及加锁操作,以保证读取到的数据是最新的且不会被其他事务修改。
5.版本控制
  • 为了维护数据的一致性和隔离性,MVCC使用了版本控制机制。事务开始时,会记录当前的最新版本号或时间戳。在事务执行过程中,只能读取到版本号小于等于事务开始时的版本或时间戳早于事务开始时间的版本。
6. 垃圾回收
  • InnoDB 有一个后台线程负责垃圾回收,定期清理不再需要的历史版本。
  • 只有当某个版本对所有活跃事务都不再可见时,才会被物理删除。
  • 为了防止旧的版本无限增加,占用过多的存储空间,MVCC采用了垃圾回收机制。当一个事务提交时,系统会检查该事务产生的版本是否还有其他事务正在使用。如果没有,那么该版本就可以被删除,释放空间。
ReadView
  • ReadView是InnoDB在实现MVCC时用到的一致性读视图,用于支持RC(Read Committed,读提交)和RR(Repeatable Read,可重复读)隔离级别的实现。ReadView包含了生成该ReadView时系统中所有活跃事务的ID列表,用于判断某个版本的数据对当前事务是否可见。
实现原理
  • MVCC的实现主要依赖读视图(Read View)和Undo Log链。读视图用于管理事务之间数据可见性的一种机制,它包含了在该时刻所有未提交事务的事务标识符以及其他一些辅助信息。Undo Log链则用于记录修改前的数据信息,以便进行事务回滚或版本控制。
  • 在读取数据时,根据读视图中的信息,去Undo Log中查找满足条件的版本,并返回给事务。如果找不到满足条件的版本,则返回NULL。

具体实现示例

假设我们有一个简单的表 users,其中有一行数据:

idnameagedb_trx_iddb_roll_ptr
1Alice30100NULL

现在有两个事务 T1 和 T2,它们分别在不同的时间点开始:

  • T1 在 t1 时间点开始,事务ID为 101。
  • T2 在 t2 时间点开始,事务ID为 102。
T1 更新数据
  • T1 执行 UPDATE users SET name = 'Bob' WHERE id = 1;

  • InnoDB 会创建一个新的版本:

    idnameagedb_trx_iddb_roll_ptr
    1Bob30101(指向上一个版本)
    1Alice30100NULL
  • T1 还未提交。

T2 读取数据
  • T2 执行 SELECT * FROM users WHERE id = 1;
  • 根据读取可见性规则,T2 只能看到事务ID小于等于自己且已提交的数据。
  • 因此,T2 会读取到 Alice 这个版本。
T1 提交
  • T1 提交事务。
  • T2 再次执行 SELECT * FROM users WHERE id = 1;
  • 现在 T2 会读取到 Bob 这个版本。

MVCC的应用场景和优点

MVCC主要应用于需要高并发读取操作的数据库系统中,如MySQL的InnoDB引擎。它的优点包括:

  1. 提高并发性能:通过维护多个数据版本,允许并发事务在不相互阻塞的情况下读取不同版本的数据,从而提高了系统的并发性能。
  2. 避免脏读:通过维护版本号和读视图,MVCC可以确保读操作不会读取到未提交的写入数据,避免了脏读问题。
  3. 支持并发写:MVCC允许多个事务同时进行写操作,通过版本管理和冲突检测来保证数据的一致性。

总结

MVCC 通过维护多个数据版本来支持高并发读写操作,确保了事务的隔离性和一致性。它通过以下关键机制实现:

  • 版本链:记录每个数据行的所有历史版本。
  • 事务ID:唯一标识每个事务。
  • 读取可见性规则:根据事务的隔离级别决定哪些版本的数据是可见的。
  • 写入操作:创建新的版本并保留旧版本。
  • 垃圾回收:定期清理不再需要的历史版本。

理解 MVCC 的底层原理对于高级 Java 面试非常重要,因为它直接关系到数据库的性能优化和设计决策。展示你对 MVCC 的深入理解,可以帮助面试官了解你在数据库管理和优化方面的知识水平。

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

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

相关文章

【python】追加写入excel

输出文件运行前(有两张表,“表1”和“Sheet1”): 目录 一:写入单表(删除所有旧工作表,写入新表)二:写入多表(删除所有旧工作表,写入新表&#x…

MySQL 数据库的备份与恢复

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

TS系列(7):知识点汇总

你好,我是沐爸,欢迎点赞、收藏、评论和关注。 一、TS是什么? TypeScript 由微软开发,是基于 JavaScript 的一个扩展语言。TypeScript 包含 JavaScript 的所有内容,是 JavaScript 的超集。TypeScript 增加了静态类型检…

LLM+知识图谱新工具! iText2KG:使用大型语言模型构建增量知识图谱

iText2KG是一个基于大型语言模型的增量知识图谱构建工具,通过从文本文档中提取实体和关系来逐步构建知识图谱。该工具具有零样本学习能力,能够在无需特定训练的情况下,在多个领域中进行知识提取。它包括文档提炼、实体提取和关系提取模块&…

Unity3D 客户端多开

Unity3D 实现客户端多开 客户端多开 最近在做好友聊天系统,为了方便测试,需要再开一个客户端。 简单的方法,就是直接拷贝一个新的项目,但是需要很多时间和占用空间。 查阅了网络资料,发现有一种软链接,…

Python水循环标准化对比算法实现

🎯要点 算法区分不同水循环数据类型:地下水、河水、降水、气温和其他,并使用相应标准化降水指数、标准化地下水指数、标准化河流水位指数和标准化降水蒸散指数。绘制和计算特定的时间序列比较统计学相关性。使用相关矩阵可视化集水区和显示空…

河南移动:核心营业系统稳定运行超300天,数据库分布式升级实践|OceanBase案例

河南移动,作为电信全业务运营企业,不仅拥有庞大的客户群体和业务规模,还引领着业务产品与服务体系的创新发展。河南移动的原有核心营业系统承载着超过6000万的庞大用户量,管理着超过80TB的海量数据,因此也面临着数据规…

pWnos1.0 靶机渗透 (Perl CGI 的反弹 shell 利用)

靶机介绍 来自 vulnhub 主机发现 ┌──(kali㉿kali)-[~/testPwnos1.0] …

阿里云ACP认证考试题库

最近有好些同学,考完阿里云ACP了,再来跟我反馈:自己花700买的阿里云ACP题库,结果答案是错的! 或者考完后发现,买的阿里云ACP题库覆盖率只有50%! 为避免大家继续踩坑,给大家分享一个阿…

qt使用QDomDocument读写xml文件

在使用QDomDocument读写xml之前需要在工程文件添加: QT xml 1.生成xml文件 void createXml(QString xmlName) {QFile file(xmlName);if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate |QIODevice::Text))return false;QDomDocument doc;QDomProcessin…

使用 Python 遍历文件夹

要解决这个问题,使用 Python 的标准库可以很好地完成。我们要做的是遍历目录树,找到所有的 text 文件,读取内容,处理空行和空格,并将处理后的内容合并到一个新的文件中。 整体思路: 遍历子目录&#xff1…

【目标检测】工程机械车辆数据集2690张4类VOC+YOLO格式

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2694 标注数量(xml文件个数):2694 标注数量(txt文件个数):2694 标注…

Star 3w+,向更安全、更泛化、更云原生的 Nacos3.0 演进

作者:席翁 Nacos 社区刚刚迎来了 Star 突破 30000 的里程碑,从此迈上了一个新的阶段。感谢大家的一路支持、信任和帮助! Nacos /nɑ:kəʊs/是 Dynamic Naming and Configuration Service 的首字母简称,定位于一个更易于构建云原…

Linux网络编程 -- 网络基础

本文主要介绍网络的一些基础概念,不涉及具体的操作原理,旨在构建对网络的基础认识。 1、网络的早期发展历程 20世纪50年代 在这一时期,计算机主机非常昂贵,而通信线路和设备相对便宜。为了共享计算机主机资源和进行信息的综合处…

关于CSS 案例_新闻内容展示

新闻要求 标题:居中加粗发布日期: 右对齐分割线: 提示, 可以使用 hr 标签正文/段落: 左侧缩进插图: 居中显示 展示效果 审核过不了&#xff0c;内容没填大家将就着看吧。 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset&qu…

python-pptx 中 placeholder 和 shape 有什么区别?

在 python-pptx 库中&#xff0c;placeholder 和 shape 是两个核心概念。虽然它们看起来相似&#xff0c;但在功能和作用上存在显著的区别。为了更好地理解这两个概念&#xff0c;我们可以通过它们的定义、使用场景以及实际代码示例来剖析其差异。 Python-pptx 的官网链接&…

【Java】六大设计原则和23种设计模式

目录 一、JAVA六大设计原则 二、JAVA23种设计模式 1. 创建型模式 2. 结构型模式 3. 行为型模式 三、设计原则与设计模式 1. 设计原则 2. 设计模式 四、单例模式 1. 饿汉式 2. 懒汉式 四、代理模式 1. 什么是代理模式 2. 为什么要用代理模式 3. 有哪几种代理模式 …

服务器几核几G几M是什么意思?如何选择?

服务器几核几G几M是什么意思&#xff1f;我们建站、搭建网络平台都要用到云服务器&#xff0c;不管在腾讯云、阿里云还是别的云服务平台选购&#xff0c;都会接触到服务器配置。云服务器就是把物理服务器&#xff08;俗称“母鸡”&#xff09;&#xff0c;用虚拟机技术虚拟出多…

Android SystemUI组件(09)唤醒亮屏 锁屏处理流程

该系列文章总纲链接&#xff1a;专题分纲目录 Android SystemUI组件 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节持续迭代之前章节的思维导图&#xff0c;主要关注左侧上方锁屏分析部分 唤醒亮屏 即可。 Power按键的处理逻辑最终是由PhoneWindowManager来…

BUSHOUND的抓包使用详解

BUSHOUND是个过滤软件&#xff0c;确切来说是在windows操作系统它的驱动层USB传输的数据。所以这个数据上可能是与USB的总线上的数据是有一点差异的。 先要选择设备的抓包。所以就是在device这个界面底下&#xff0c;我们首先要选择我们要抓的设备。 尝试下键盘设备 电脑键盘…