InnoDB存储引擎对MVCC的实现

devtools/2024/11/15 19:14:25/

二、MVCC 的概念及重要性

  1. 什么是 MVCC?

    • MVCC(Multi-Version Concurrency Control),即多版本并发控制,是一种用于处理数据库并发操作的技术。它通过保存数据的多个版本,使得不同的事务可以看到不同版本的数据,从而实现并发操作时的数据一致性。
    • 在传统的数据库并发控制中,通常使用锁机制来防止多个事务同时对同一数据进行读写操作。然而,锁机制会导致事务之间的阻塞,降低数据库的并发性能。MVCC 则通过保存数据的多个版本,避免了锁机制带来的阻塞问题,提高了数据库的并发性能。
  2. MVCC 的重要性

    • 提高并发性能:MVCC 允许多个事务同时读取同一数据的不同版本,避免了事务之间的阻塞,从而提高了数据库的并发性能。
    • 实现事务隔离级别:InnoDB 存储引擎通过 MVCC 实现了不同的事务隔离级别,如 READ COMMITTED 和 REPEATABLE READ。这些隔离级别保证了事务之间的独立性和数据的一致性。
    • 支持长事务:在一些应用场景中,可能需要执行长时间的事务。MVCC 可以让长事务看到一致的数据视图,而不会被其他事务的修改所影响。

三、InnoDB 存储引擎中 MVCC 的实现原理

  1. 版本链

    • InnoDB 存储引擎通过为每行数据保存多个版本,形成一个版本链。每当有事务对数据进行修改时,新的数据版本会被创建,并通过指针与旧版本链接起来。
    • 例如,当事务 T1 对一行数据进行修改时,InnoDB 会创建一个新的数据版本 V2,并将其与旧版本 V1 链接起来。此时,版本链为 V1->V2。如果事务 T2 再次对该行数据进行修改,InnoDB 会创建一个新的数据版本 V3,并将其与版本 V2 链接起来,版本链变为 V1->V2->V3。
  2. 事务 ID 和隐藏列

    • InnoDB 为每一行数据添加了两个隐藏列:一个是创建版本号(created_version),用于记录创建该行数据的事务 ID;另一个是删除版本号(deleted_version),用于记录删除该行数据的事务 ID。
    • 当一个事务开始时,它会被分配一个唯一的事务 ID。在事务进行读写操作时,通过比较事务 ID 和行数据的版本号来确定可见性。
  3. 可见性判断规则

    • 对于插入操作,新插入的数据版本的创建版本号为当前事务 ID。
    • 例如,事务 T1 插入一行数据,该行数据的创建版本号为 T1 的事务 ID。
    • 对于删除操作,将行数据的删除版本号设置为当前事务 ID。
    • 例如,事务 T2 删除一行数据,该行数据的删除版本号被设置为 T2 的事务 ID。
    • 对于更新操作,实际上是先删除旧版本的数据,再插入新版本的数据。
    • 例如,事务 T3 更新一行数据,InnoDB 会先将旧版本的数据的删除版本号设置为 T3 的事务 ID,然后创建一个新的数据版本,并将其创建版本号设置为 T3 的事务 ID。
    • 当一个事务读取数据时,会根据以下规则判断数据版本的可见性:
      • 如果行数据的删除版本号大于当前事务 ID,表示该行数据已被其他事务删除,不可见。
      • 如果行数据的创建版本号小于等于当前事务 ID,并且(行数据没有删除版本号或者删除版本号大于当前事务 ID),表示该行数据对当前事务可见。

四、MVCC 的优势详解

  1. 提高并发性能

    • 传统的锁机制会导致事务之间的阻塞,尤其是在高并发场景下,可能会出现大量的事务等待锁的情况,从而降低数据库的并发性能。
    • MVCC 允许多个事务同时读取同一数据的不同版本,避免了事务之间的阻塞。例如,事务 T1 正在读取一行数据的版本 V1,此时事务 T2 可以对该行数据进行修改,并创建一个新的版本 V2。事务 T1 不受事务 T2 的影响,仍然可以继续读取版本 V1 的数据。
    • 此外,MVCC 还可以减少锁的争用,提高数据库的吞吐量。在高并发场景下,多个事务可以同时对不同的数据版本进行读写操作,而不需要竞争同一把锁,从而提高了数据库的并发性能。
  2. 实现事务隔离级别

    • InnoDB 存储引擎通过 MVCC 实现了不同的事务隔离级别,如 READ COMMITTED 和 REPEATABLE READ。
    • 在 READ COMMITTED 隔离级别下,事务只能看到已经提交的事务所做的修改。当一个事务读取数据时,它会根据当前事务 ID 和行数据的版本号来确定可见性。如果行数据的创建版本号小于等于当前事务 ID,并且行数据的删除版本号大于当前事务 ID 或者没有删除版本号,那么该行数据对当前事务可见。
    • 在 REPEATABLE READ 隔离级别下,事务可以重复读取同一数据的相同版本,保证了事务的可重复读特性。InnoDB 存储引擎通过在事务开始时创建一个一致性视图(snapshot),来实现 REPEATABLE READ 隔离级别。一致性视图包含了事务开始时所有已经提交的事务的版本信息。当事务读取数据时,它会根据一致性视图和行数据的版本号来确定可见性。如果行数据的创建版本号小于等于一致性视图中的最小事务 ID,并且行数据的删除版本号大于一致性视图中的最大事务 ID 或者没有删除版本号,那么该行数据对当前事务可见。
  3. 支持长事务

    • 在一些应用场景中,可能需要执行长时间的事务。例如,在数据分析和报表生成等场景中,可能需要对大量的数据进行复杂的查询和计算,这些操作可能需要花费很长时间才能完成。
    • MVCC 可以让长事务看到一致的数据视图,而不会被其他事务的修改所影响。当一个长事务开始时,它会创建一个一致性视图。在事务执行过程中,它可以根据一致性视图和行数据的版本号来确定可见性。即使其他事务对数据进行了修改,长事务仍然可以看到它开始时的数据版本,从而保证了数据的一致性。

五、总结


http://www.ppmy.cn/devtools/134238.html

相关文章

三、运算符、数据类型转换(显式、隐式)、语句(if、三元、switch、while、for)

1. 运算符 1.1 自增自减 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> &…

写给初学者的React Native 全栈开发实战班

React Native 全栈开发实战班 亲爱的同学们&#xff1a; 很高兴在这里与大家相聚&#xff01;我是你们的讲师&#xff0c;将带领大家一起踏上 React Native 移动开发的学习之旅。 为什么选择 React Native&#xff1f; 在这个移动互联网时代&#xff0c;App 开发工程师已经…

kafka日志清理配置

log.retention.bytes 是 Apache Kafka 配置文件中的一个参数&#xff0c;用于指定 Kafka 日志文件的最大存储大小。该参数控制每个日志主题分区&#xff08;log partition&#xff09;可以保留的最大字节数。 详细解释&#xff1a; 在 Kafka 中&#xff0c;消息以日志&#xff…

Python爬虫定义入门知识

Python爬虫&#xff0c;也称为网络爬虫或网页爬虫&#xff0c;是一种自动化程序&#xff0c;用于抓取互联网上的数据。Python因其简洁的语法和强大的库支持&#xff0c;成为编写爬虫的首选语言之一。以下是Python爬虫的一些基本概念和解读&#xff1a; 1. 基本概念 爬虫&…

Python学习从0到1 day27 Python 高阶技巧 ③ 设计模式 — 单例模式

此去经年&#xff0c;再难同游 —— 24.11.11 一、什么是设计模式 设计模式是一种编程套路&#xff0c;可以极大的方便程序的开发最常见、最经典的设计模式&#xff0c;就是我们所学习的面向对象了。 除了面向对象外,在编程中也有很多既定的套路可以方便开发,我们称之为设计模…

element-plus <el-date-picker>日期选择器踩坑!!!!

我怎么一上午踩两个坑&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff08;大声bb&#xff09; 原来的vue2老项目是这样写的 <el-form-item label"时间" prop"time"><el-date-pickerv-model"addForm.time"typ…

建立更及时、更有效的安全生产优化提升策略的智慧油站开源了

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。增…

使用react+copy-to-clipboard封装双击复制组件

前言&#xff1a; 最近在公司研发后台系统&#xff0c;用户反馈在双击某些信息时希望可以进行复制的操作&#xff0c;多处使用进而封装为组件 首先&#xff1a;安装copy-to-clipboard npm i --save copy-to-clipboard 其次&#xff1a;封装组件 import React, { memo, useCal…