MySQL InnoDB 之 多版本并发控制(MVCC)

多版本并发控制(MVCC,Multi-Version Concurrency Control)是数据库管理系统中用于提供高并发性和在事务处理中实现隔离级别的一种技术。MVCC 允许系统在不完全锁定数据库资源的情况下,处理多个并发事务,从而提高了数据库的吞吐量和用户的响应速度。这是通过为每个读取操作创建数据的一个快照来实现的,使得事务可以访问数据的特定版本,而不是最新数据。

MVCC 的工作原理

MVCC 的核心是为数据库中的每个项维护多个版本。每个事务操作数据时,都会根据其隔离级别看到一个一致的快照版本,这意味着:

  • 读操作 不会阻塞写操作,因为它们可以访问到数据的旧版本。
  • 写操作 也不会阻塞读操作,因为新的数据修改会创建新的数据版本,而不是直接覆盖旧数据。

这样,不同的事务就可以同时进行读写操作,而不会互相干扰。

MVCC 如何处理事务

在 MVCC 中,每个事务都有一个唯一的时间戳(或事务ID),这个时间戳用于确定事务的执行顺序以及它应该看到的数据版本。当事务读取数据时,它会看到在该事务开始之前最后提交的数据版本。当事务更新数据时,它会创建数据的新版本,而不是覆盖现有数据,同时保留旧版本的数据以便其他事务访问。

由于我目前无法直接创建和显示图形或图片,我将以伪代码和描述的形式帮助你理解多版本并发控制(MVCC)的工作流程。你可以根据下面的描述,使用流程图软件或绘图工具来绘制流程图。

开始
|
|----> 事务开始
|        | (为事务分配唯一时间戳)
|        
|----> 读取操作
|        |----> 查询特定时间戳之前的最新数据版本
|        |        |
|        |        |----> 返回数据
|
|----> 写入操作
|        |----> 生成数据的新版本
|        |        | (带有当前事务的时间戳)
|        |        
|        |----> 写操作不阻塞读操作
|                 | (读者可以访问旧版本数据)
|
|----> 事务提交/回滚|----> 提交:使数据的新版本可用|        |----> 回滚:放弃数据的新版本||----> 启动垃圾回收| (清理不再需要的旧数据版本)结束

在这里插入图片描述

MVCC 工作流程解析:

  1. 事务开始:每个新事务都会被分配一个唯一的时间戳或事务ID。

  2. 读取操作

    • 当事务请求读取数据时,系统会查找该事务时间戳之前的数据版本,确保事务可以看到一个一致的数据快照。
  3. 写入操作

    • 写入操作会生成数据的新版本,并将其标记为由当前事务创建。这样,直到事务提交之前,其他事务是看不到这个新版本的。
    • 由于每个版本的数据都是独立的,因此写操作不会阻塞读操作,读事务仍然可以访问旧版本的数据。
  4. 事务提交/回滚

    • 如果事务成功提交,数据的新版本将变得对其他事务可见。
    • 如果事务回滚,则创建的数据新版本将被丢弃。
    • 随后,系统可能会触发垃圾回收过程,清理那些不再被任何事务所需的旧数据版本。

这个流程概括了 MVCC 在处理读取和写入操作时如何允许多个事务并发执行,同时保持数据的一致性和隔离性。希望这能帮助你理解 MVCC 的基本工作机制!

MVCC 与事务隔离级别

MVCC 支持 SQL 标准定义的不同事务隔离级别,包括:

  • 读未提交(Read Uncommitted):最低级别,事务可以看到其他未提交事务的更改。MVCC 通常不用于实现这个级别,因为它允许“脏读”。
  • 读已提交(Read Committed):保证事务只能看到已经提交的更改。在 MVCC 中,事务开始时所看到的数据快照反映了那一刻所有已提交的更改。
  • 可重复读(Repeatable Read):保证在事务内部执行的所有读取操作都能看到相同的数据快照。在 MVCC 中,这意味着事务在开始时获得的数据快照在事务结束前不会改变。
  • 串行化(Serializable):最高级别,通过加锁或使用乐观并发控制来保证事务的串行执行,避免幻读。MVCC 实现串行化通常需要额外的机制,如检测到潜在的冲突时重试事务。

核心模块

多版本并发控制(MVCC)是一个复杂且功能强大的机制,广泛应用于各种数据库系统中以提高并发性和性能。除了基本概念和工作流程外,还有一些更深入的知识点和高级主题值得探索:

1. 快照隔离与实现细节

  • 快照隔离(Snapshot Isolation):MVCC 的关键特性之一是提供了快照隔离级别,它允许事务看到数据库在特定时间点的一致状态快照。不同的数据库系统可能有不同的实现机制来保证快照的一致性和效率。
  • 可见性规则:数据库如何决定一个数据版本是否对某个事务可见是 MVCC 实现的核心。这通常涉及到事务ID和数据版本的时间戳比较。

2. 垃圾回收(Garbage Collection)

  • 版本清理:随着时间的推移,数据库中会积累许多不再被任何事务访问的旧数据版本。数据库需要定期清理这些版本以释放空间,这个过程称为垃圾回收。
  • 清理策略:不同的数据库系统可能采用不同的策略来进行垃圾回收,比如定期清理、惰性清理或在后台运行的清理进程。

3. 优化和挑战

  • 写放大(Write Amplification):MVCC 通过创建数据的新版本来避免写操作直接覆盖旧数据,这可能导致写放大现象,即实际写入的数据量远大于应用程序请求的数据量。
  • 读性能:虽然 MVCC 提高了并发性,但是在处理大量并发读取时,确定数据版本的可见性可能会导致性能开销。
  • 隔离级别的实现:不同的数据库如何实现 SQL 标准的各种隔离级别,以及这些实现对性能和一致性的影响,是 MVCC 中的一个重要话题。

4. 在不同数据库系统中的实现

  • PostgreSQL:使用事务ID进行版本控制,每行数据都包含创建和失效的事务ID,用于决定数据的可见性。
  • MySQL/InnoDB:InnoDB 通过在每行记录中维护额外的系统版本号(用于快照读)和事务版本号(用于当前读),来实现 MVCC。
  • Oracle:使用撤销段(Undo Segments)来存储旧数据版本,以支持“回滚”操作和提供读一致性的快照。

5. 并发控制与性能优化

  • 锁定策略与MVCC:虽然MVCC减少了锁的需求,但在某些情况下,如更新和删除操作,仍然需要适当的锁定机制以保证数据的一致性。
  • 索引维护:MVCC对索引的影响及如何高效地维护索引结构,尤其是在高并发环境中。

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

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

相关文章

Datacom HCIP笔记-OSPF协议 之二

链路:路由器之间的相连的链路 状态:链路上的参数在某一时刻的状态 单边邻居 one way? 收到对端发来的hello报文,其中没有自己的router id LSA类型: 1类LSA:描述路由器自身加入到ospf进程中的直连链路的状态…

大数据-TXT文本重复行计数工具

支持系统类型:Windows 64位系统 Linux 64位系统 苹果64位系统 硬盘要求:固态硬盘(有效剩余磁盘空间大小最低3倍于大数据文件的大小) 内存要求:最低8G(例如只有几百G数据) 如果处理TB级大数据文…

STM32 软件I2C方式读取AS5600磁编码器获取角度例程

STM32 软件I2C方式读取AS5600磁编码器获取角度例程 🔖本例程使用正点原子例程作为工程模板创建。 📘 硬件电路部分 🌿原理图部分: 🌿PCB布线和电路 ✨注意事项:有些硬件需要I2C上拉,否则检…

校园局域网钓鱼实例

Hello ! 我是"我是小恒不会java" 本文仅作为针对普通同学眼中的网络安全,设计的钓鱼案例也是怎么简陋怎么来 注:本文不会外传代码,后端已停止使用,仅作为学习使用 基本原理 内网主机扫描DNS劫持前端模拟后端…

【2023】kafka入门学习与使用(kafka-2)

目录💻 一、基本介绍1、产生背景2、 消息队列介绍2.1、消息队列的本质作用2.2、消息队列的使用场景2.3、消息队列的两种模式2.4、消息队列选型: 二、kafka组件1、核心组件概念2、架构3、基本使用3.1、消费消息3.2、单播和多播消息的实现 4、主题和分区4.…

大模型与数据分析:探索Text-to-SQL

当今大模型如此火热,作为一名数据同学,持续在关注LLM是如何应用在数据分析中的,也关注到很多公司推出了AI数智助手的产品,比如火山引擎数智平台VeDI—AI助手、 Kyligence Copilot AI数智助理、ThoughtSpot等,通过接入人…

Node.js的Event Loop:六个阶段详解

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

括号生成(回溯+剪枝)

22. 括号生成 - 力扣(LeetCode) 题目描述 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 样例输入 示例 1: 输入:n 3 输出:["((()))&q…

五年前端的面试之旅

哈喽我是树酱,最近整理了下前端面试相关的知识题库,借此分享给各位小伙伴,帮助小伙伴早日拿到钟意的offer! 前言 最近就业市场不景气,跟大环境较差也有关,确实给我们也会带来一定的挑战。在招聘网站投简历的…

python批量转化pdf图片为jpg图片

1.把pdf图片批量转为jpg;需要注意的是,需要先安装poppler这个软件,具体安装教程放在下面代码中了 2.代码 #poppler安装教程参考:https://blog.csdn.net/wy01415/article/details/110257130 #windows上poppler下载链接&#xff1a…

从零开始机器学习(机器学习 监督学习之线性回归 损失函数及可视化 梯度下降 线性回归的平方误差损失函数 lab实验)

文章目录 机器学习定义监督学习之线性回归损失函数及可视化梯度下降线性回归的平方误差损失函数lab实验 机器学习定义 机器学习就是机器通过不断训练数据集从逐渐知道正确的结果 机器学习包括监督学习和非监督学习 监督学习:需要输入数据和结果数据来不断训练学习…

linux0.11中jmpi 0,8解析

系统在执行该行代码时已经为保护模式, jmpi 0,8会将段选择子(selector)载入cs段寄存器,并计算出逻辑地址。 段选择子的结构如下: 段选择子包括三部分:描述符索引(index)、TI、请求特权级(RPL)。…

SpringMVC常见面试题

1:Spring mvc执行流程 回答: 版本1:视图版本,jsp 用户发送出请求到前端控制器DispatcherServletDispatcherServlet收到请求调用HandlerMapping(处理映射器)HandlerMapping找到具体的处理器,生成处理器对象及处理器拦…

二十四种设计模式与六大设计原则(一):【策略模式、代理模式、单例模式、多例模式、工厂方法模式、抽象工厂模式】的定义、举例说明、核心思想、适用场景和优缺点

目录 策略模式【Strategy Pattern】 定义 举例说明 核心思想 适用场景 优缺点 代理模式【Proxy Pattern】 定义 举例说明 核心思想 适用场景 优缺点 单例模式【Singleton Pattern】 定义 举例说明 核心思想 适用场景 优缺点 多例模式【Multition Pattern】…

C# 微软官方学习文档

链接:https://learn.microsoft.com/zh-cn/dotnet/csharp/ 在C#的学习过程中,我们可以参考微软官方的学习文档。它是一个免费的学习平台,提供了丰富的C#学习路径和教程(如下图),对我们入门到高级应用开发都…

Intellij IDEA / Android studio 可持续开发笔记

Intellij 的Java/安卓工具链有着一种不可持续性,这种不可持续性体现在多个方面。 首先是不可持续运行。IDEA 使用时间越长,内存占用越大,从不主动释放。运行时间越长,日志越多,从不主动清理。 然后是不完整的开源&am…

用html实现一个手风琴相册设计

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>手风琴相册设计</title><link rel"stylesheet" href"./style.css"> </head> <body> <h1>Accordio…

Linux 著名的sudo、su是什么?怎么用?

一、su 什么是su&#xff1f; su命令&#xff08;简称是&#xff1a;substitute 或者 switch user &#xff09;用于切换到另一个用户&#xff0c;没有指定用户名&#xff0c;则默认情况下将以root用户登录。 为了向后兼容&#xff0c;su默认不改变当前目录&#xff0c;只设…

【蓝桥杯第十三届省赛】(部分详解)

九进制转十进制 #include <iostream> #include<math.h> using namespace std; int main() {cout << 2*pow(9,3)0*pow(9,2)2*pow(9,1)2*pow(9,0) << endl;return 0; }顺子日期 #include <iostream> using namespace std; int main() {// 请在此…

分布式理论:CAP理论 BASE理论

文章目录 1. CAP定理1.1 一致性1.3 分区容错1.4 矛盾 2. BASE理论3. 解决分布式事务的思路4. 扩展 解决分布式事务问题&#xff0c;需要一些分布式系统的基础知识作为理论指导。 1. CAP定理 Consistency(一致性): 用户访问分布式系统中的任意节点&#xff0c;得到的数据必须一…