讲解Mysql InnoDB的MVCC

1. 定义

        MVCC是多版本并发控制(Multi - Version Concurrency Control)的缩写。它是InnoDB存储引擎实现高并发控制的一种机制。在数据库系统中,多个事务可能会同时对数据进行读写操作,而MVCC通过为数据行保存多个版本来解决并发事务之间的冲突问题,使得数据库在保证数据一致性的同时,能够支持更多的并发操作。MVCC的核心思想是:为每一行数据维护多个版本,使得读写操作可以并发执行而不互相阻塞。

2. 事务和事务ID

        在InnoDB中,事务是MVCC的核心。每个事务在开始时都会被分配一个唯一的事务ID(Transaction ID,简称TXID)。事务ID是单调递增的,用于标识事务的先后顺序。

  • 事务ID的作用

    • 事务ID用于标记数据版本的创建者和可见性。

    • 事务ID用于判断事务之间的先后顺序,从而实现并发控制。

3. 数据版本的存储结构 

        InnoDB使用行版本控制来实现MVCC。每行数据在物理存储上可能有多个版本,这些版本通过隐藏的列和指针进行管理。

  • 隐藏列

    • DB_TRX_ID(事务ID):记录最后一次对该行进行修改的事务的ID。这个ID是递增的,每次事务开始时都会分配一个唯一的事务ID。当一个事务对数据行进行修改时,InnoDB会将这个事务的ID记录在DB_TRX_ID列中。

    • DB_ROLL_PTR(回滚指针):回滚指针指向该行数据的旧版本。旧版本数据存储在InnoDB的回滚段(Undo Log)中。Undo Log是InnoDB用来存储数据行旧版本的地方,它记录了数据行在各个事务修改前的状态。

    • DB_ROW_ID:行ID,用于唯一标识一行数据。

  • 版本链

    • 每行数据的多个版本通过DB_ROLL_PTR链接在一起,形成一个版本链。

    • 最新的版本存储在表空间中,旧版本存储在回滚段(Undo Log)中。

  • ReadView:

       决定当前事务能看到哪些版本的数据,包含: 
    • m_ids:当前活跃(未提交)事务ID列表。

    • min_trx_id:m_ids中的最小值。

    • max_trx_id:下一个将分配的事务ID。

    • creator_trx_id:创建该ReadView的事务ID。

4. MVCC的可见性规则

        InnoDB通过事务ID和版本链来判断数据版本的可见性。具体规则如下:

4.1 读操作的可见性规则

  • 一致性读(Consistent Read)

    • 默认情况下,InnoDB使用一致性读,即读取数据时会看到事务开始时的数据库快照。

    • 事务只能看到在它开始之前已经提交的版本,或者它自己插入的版本。

    • 事务不能看到在它开始之后其他事务插入或更新的版本。

  • 活跃事务是指在当前事务开始时仍然在运行的事务。换句话说,这些事务可能尚未提交或回滚。

    示例:假设当前数据库中有以下事务:
    • 事务ID为102的事务也正在运行。

    • 事务ID为101的事务正在运行(尚未提交或回滚)。

    • 事务ID为100的事务已经提交。

    • 现在,一个新的事务(事务ID为103)开始执行。对于事务103来说:

    • 活跃事务:事务ID为101102的事务,因为它们在事务103开始时仍在运行。

    • 非活跃事务:事务ID为100的事务,因为它在事务103开始之前已经提交。

  • 快照读的判断逻辑

    • 数据版本:记录了每条记录在不同时间点的状态。

    • 活跃事务:记录了在当前事务开始时仍在运行的事务。

    • 如果一个数据版本的DB_TRX_ID小于当前事务的最小活跃事务ID

      • 这个版本是由一个已经提交的事务生成的,对当前事务可见。

    • 如果一个数据版本的DB_TRX_ID大于当前事务的最大活跃事务ID

      • 这个版本是由一个在当前事务开始之后才开始的事务生成的,对当前事务不可见。

    • 如果一个数据版本的DB_TRX_ID在当前事务的活跃事务列表中

      • 这个版本是由一个仍在运行的事务生成的,对当前事务不可见。需要回溯到旧版本,继续判断,直到找到一个符合上述条件的版本。

4.2 写操作的可见性规则

  • 当前读(Current Read)

    • 写操作(如INSERT、UPDATE、DELETE)会获取行锁,并直接操作最新的数据版本。

    • 写操作会生成新的数据版本,并更新DB_TRX_ID为当前事务ID。

    • 如果是更新操作,旧版本会被移动到回滚段中,并通过DB_ROLL_PTR链接。

5. 事务的隔离级别与MVCC

        InnoDB支持多种事务隔离级别,不同隔离级别对MVCC的实现方式和可见性规则有所不同。

4.1 读已提交(Read Committed)

  • 特点

    • 事务只能看到在它开始之前已经提交的版本。

    • 每次读取数据时,InnoDB都会重新构建一个快照。

    • 不允许读取未提交的版本,避免了“脏读”问题。

  • MVCC实现

    • 对于每个SELECT操作,InnoDB会根据当前事务的读视图,找到最新的已提交版本。

    • 如果数据被其他事务锁定,当前事务会等待锁释放。

5.2 可重复读(Repeatable Read)

  • 特点

    • 事务在执行期间看到的数据库快照是一致的,即使其他事务在并发修改数据。

    • 避免了“不可重复读”问题。

  • MVCC实现

    • 事务开始时,InnoDB会创建一个快照视图,后续的读操作都基于这个快照。

    • 事务只能看到在它开始之前已经提交的版本,或者它自己插入的版本。

    • 如果其他事务在并发修改数据,当前事务不会看到这些修改,除非它自己也进行了修改。

5.3 串行化(Serializable)

  • 特点

    • 最严格的隔离级别,事务之间完全隔离。

    • 避免了所有并发问题,但性能开销最大。

  • MVCC实现

    • 除了使用MVCC的版本控制外,还会通过加锁机制(如表锁或行锁)来确保事务之间的串行执行。

    • 读操作也会加锁,防止其他事务修改数据。

6. 回滚段(Undo Log)的作用

        回滚段是InnoDB实现MVCC的关键组件之一。它用于存储数据的旧版本,以便支持一致性读和事务回滚。

  • 存储旧版本

    • 当事务更新数据时,旧版本会被移动到回滚段中,并通过DB_ROLL_PTR链接。

    • 回滚段中的旧版本数据用于支持一致性读,事务可以根据需要回溯到旧版本。

  • 事务回滚

    • 如果事务需要回滚,InnoDB会通过回滚段中的旧版本数据恢复到事务开始之前的状态。

  • 垃圾回收

    • 当没有事务再需要回滚段中的旧版本数据时,InnoDB会进行垃圾回收,释放回滚段的空间。

7. 总结

        InnoDB的MVCC机制是一种高效的并发控制机制,它通过为数据行保存多个版本,实现了读操作和写操作之间的高并发性,减少了锁竞争,并保证了事务的一致性读。然而,MVCC机制也存在一些局限性,如版本链过长、垃圾回收问题和快照隔离级别下的幻读问题。尽管如此,InnoDB的MVCC机制仍然是现代数据库系统中一种重要的并发控制机制,广泛应用于各种高并发的场景中。

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

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

相关文章

ZeroMQ Sockets介绍及应用示例

1. 概念解释 ZeroMQ Sockets提供了一种类标准套接字(socket-like)的 API,是消息导向的通信机制,基于 TCP/UDP 等传输层协议,但封装了底层细节(如连接管理、消息路由、缓冲区等),提供…

语音合成之十五 语音合成(TTS)分句生成拼接时的响度一致性问题:现状、成因与对策

语音合成(TTS)分句生成拼接时的响度一致性问题:现状、成因与对策 引言:分段式文本转语音中的响度一致性挑战业界对响度差异问题的认知拼接语音片段中响度变化的根本原因分段拼接的固有挑战各片段预测韵律特征的差异文本特征和模型…

Android中Binder驱动作用?

Binder驱动的作用与核心功能 Binder驱动是Android系统中实现进程间通信(IPC)的核心底层组件,它工作于Linux内核层,负责管理跨进程通信的建立、数据传输、资源同步等关键任务。以下是其核心作用及实现细节: 1. ​​进程…

网络学习-TCP协议(七)

一、TCP协议 TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。 1、三次握手 客户端: 1、先发起连接,发送SYN置1,seqnum12345(随机值)----半连接…

【Python 基础与实战】从基础语法到项目应用的全流程解析

(1)列表和元组的区别是什么?如何从列表创建元组?如何从元组创建列表? 列表和元组的区别: 可变性:列表是可变的,即可以对列表进行元素的增、删、改操作。例如,可以使用append()方法添加元素,r…

Docker部署Zookeeper集群

简介 ZooKeeper 是一个开源的分布式协调服务,由 Apache 软件基金会开发和维护。它主要用于管理和协调分布式系统中的多个节点,以解决分布式环境下的常见问题,如配置管理、服务发现、分布式锁等。ZooKeeper 提供了一种可靠的机制,…

【学习笔记】Sophus (Python) 使用文档

以下是一份针对 Sophus 库的 Python 使用文档,涵盖基础概念、安装方法、核心功能及代码示例。内容围绕 SO3(3D旋转群)和 SE3(3D刚体变换群)展开,适合机器人学、SLAM、三维几何等领域。 Sophus (Python) 使用…

计算机图形学:(三)MVP变换扩展

Three.js WebGL允许把JavaScript和OpenGL 结合在一起运用,但使用WebGL原生的API来写3D程序非常的复杂,同时需要相对较多的数学知识,对于前端开发者来说学习成本非常高。 Three.js是基于webGL的封装的一个易于使用且轻量级的3D库,T…

MySQL数据库操作合集

一、SQL通用语法 ①SQL语句可以单行或多行书写,以分号结尾。 ②SQL语句可以使用空格/缩进来增强语句可读性。 ③MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。 ④注释: 单行注释: -- 注释内容 或 # 注释内容&#…

传统工程项目管理与业财一体化管理的区别?

在工程项目管理领域,传统管理模式与新兴的业财一体化管理模式正在形成鲜明对比。随着数字化转型的加速,工程行业对高效、透明、协同的管理需求日益迫切。传统工程项目管理依赖人工操作、分散系统和分模块管理,难以应对复杂项目的全生命周期需…

敦煌网测评从环境搭建到风控应对,精细化运营打造安全测评体系

自养号测评,抢占流量为快速提升产品权重和销量,很多卖家常采用自己养号补单测评的方式,技术搭建需要很多要素 一、硬件参数的关联性 在我们使用设备进行注册或操作账号的过程中,系统会记录下大量的系统与网络参数,其中…

redis Pub/Sub 简介 -16 (PUBLISH、SUBSCRIBE、PSUBSCRIBE)

Redis Pub/Sub 简介:PUBLISH、SUBSCRIBE、PSUBSCRIBE Redis Pub/Sub 是一种强大的消息传递范例,可在应用程序的不同部分之间实现实时通信。它是构建可扩展和响应式系统的基石,允许组件在没有直接依赖的情况下进行交互。本章将全面介绍 Redis…

JavaSE核心知识点03高级特性03-01(集合框架)

🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 JavaSE核心知识点03高级特性03-01&#xff0…

日志分析-IIS日志分析

环境准备 https://xj.edisec.net/challenges/115 题目要求 windows系统中才有的IIS服务 既然是windows平台,当然需要rdp登录,在ssh登录失败 解题过程 phpstudy--2018站点日志.(.log文件)所在路径,提供绝对路径 Windows服务的日志一般有固定…

一、web安全基础入门

1、Windows命令 文件和目录操作 dir:列出当前目录下的文件和子目录。cd:切换目录,例如 cd C:\Users 切换到C盘的Users目录。md 或 mkdir:创建新目录,如 md testdir。rd 或 rmdir:删除空目录,例…

动态规划应用场景 + 代表题目清单(模板加上套路加上题单)

1. 序列型DP(Sequence DP) ✅ 应用场景 单个或多个序列(数组/字符串),求最优子结构。 常见问题:最长递增子序列、最长公共子序列、回文子序列。 🧠 套路总结 单序列:dp[i] max(…

Linux iSCSI存储共享实验指南

实验介绍 1、在Linux平台上通过iSCSI协议实现IP-SAN存储共享 2、掌握存储导出(export)和存储导入(import)的配置方法 3、学习iSCSI存储的发现、连接、断开和管理操作 1、实验环境 两台同网段的Linux虚拟机(无需物理交换机) 操作系统:Lin…

从 Docker 到 runC

从 Docker 到 runC:容器底层原理详解 目录 1. Docker 与 runC 的关系 2. Docker 的核心组件 3. runC 的核心功能 4. 实战示例:从 Docker 到 runC 4.1 示例场景:运行一个简单容器 4.2 Docker 底层调用 runC 的流程 4.3 查看 runC 的调用 4.4 直接调用 runC 创建容器 …

使用Python在PowerPoint中插入形状(Shape)

在进行演示文稿设计时,形状(Shape)不仅可以增强视觉效果,还可以用于展示流程图、标注、数据图示等。借助Python,我们可以通过代码快速批量地在PPT中添加各种形状,提升设计效率。本文将介绍如何使用Python向…

Windows系统下MySQL 8.4.5压缩包安装详细教程

一、MySQL 8.4.5新特性概览 相较于旧版本,MySQL 8.4.5在性能与功能上实现了显著提升: 性能优化:官方测试显示,在高并发场景下,其读写性能较5.7版本提升近2倍,尤其在处理热点数据竞争问题时表现更为出色。…