高级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…

Java - LeetCode面试经典150题 - 区间 (三)

区间 228. 汇总区间 题目 给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。 列表中…

【C语言进阶】系统测试与调试

1. 引言 在开始本教程的深度学习之前,我们需要了解整个教程的目标及其结构,以及为何进阶学习是提升C语言技能的关键。 目标和结构: 教程目标:本教程旨在通过系统化的学习,从单元测试、系统集成测试到调试技巧&#xf…

JavaScript中的数组改变原数组的方法

数组 var a [1, 2, 3, 5, 8, 13, 21] 改变原数组的方法 push(value) 数组末尾添加一个或多个元素,并返回新的数组长度 推入,a.push(34) 简单,不演示了 pop() 删除最后一个元素,并返回该元素的值 弹出,a.pop()…

MySQL 数据库的备份与恢复

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

探索Python的魔法:装饰器模式的奥秘

引言 装饰器模式是一种结构型设计模式,它通过创建一个包装对象来包含真实的对象,从而在不修改原有对象的基础上扩展其功能。在Python中,装饰器模式尤为流行,因为它提供了一种非常Pythonic的方式来增强函数或类的功能。 基础语法…

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

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

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

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

Unity3D 客户端多开

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

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

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

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

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

MongoDB 的基本使用

目录 数据库的创建和删除 创建数据库 查看数据库 删除数据库 集合的创建和删除 显示创建 查看 删除集合 隐式创建 文档的插入和查询 单个文档的插入 insertOne insertMany 查询 嵌入式文档 查询数组 查询数组元素 为数组元素指定多个条件 通过对数组元素使…

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 标注…

舞韵流转:SpringBoot实现古典舞在线交流新体验

第二章 相关技术介绍 2.1Java技术 Java是一种非常常用的编程语言,在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中,Java的身影无处不在,并且拥有旺盛的生命力。Java的跨平台能力十分强大,只需一次编译&#xf…

Oracle架构之物理存储之日志文件

文章目录 1 日志文件1.1 重做日志文件(Redo Log Files)1.1.1 定义1.1.2 联机日志的相关概念1.1.3 动态性能视图1.1.4 手工切换日志1.1.5 添加日志文件组和日志组成员1.1.6 删除日志组和日志组成员1.1.6.1 前言1.1.6.2 删除日志组1.1.6.3 删除日志组成员 …

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

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