MySQL事务篇2:InnoDB引擎

news2025/2/25 20:36:50

        InnoDB是MySQL的默认存储引擎,支持ACID事务、行级锁定和外键约束,通过多版本并发控制(MVCC)实现高并发性能。InnoDB使用聚簇索引存储数据,具备崩溃恢复能力,确保数据一致性和完整性。其主要特性包括数据和索引的高效管理、可靠的事务处理和强大的并发控制,是处理复杂查询和高并发应用的理想选择。

一、逻辑存储结构

        InnoDB 的逻辑存储结构主要包括以下几个层次:表空间、段、区和页。通过这种多层次的逻辑存储结构,实现了高效的数据存储和管理,支持复杂的事务操作和高并发访问。表空间、段、区和页的分层结构确保了数据的有序组织和快速访问,同时减少了磁盘碎片,提高了整体性能和可靠性。

表空间(Tablespace)
  ├── 段(Segment)
  │    ├── 数据段(Data Segment)
  │    ├── 索引段(Index Segment)
  │    └── 回滚段(Undo Segment)
  ├── 区(Extent)
  │    ├── 页(Page 0)
  │    ├── 页(Page 1)
  │    └── ...
  └── 页(Page 63)

1. 表空间(Tablespace)

表空间是 InnoDB 存储数据的最高层次的逻辑结构。InnoDB 有两种类型的表空间:

  • 共享表空间:所有表的数据和索引存储在一个或多个共享表空间文件(如 ibdata1)。
  • 独立表空间:每个表的数据和索引存储在各自独立的表空间文件(即 .ibd 文件)。

配置参数 innodb_file_per_table 用于设置是使用共享表空间还是独立表空间。

2. 段(Segment)

每个表和索引在表空间中都有自己的段。段是存储特定类型数据的逻辑结构,包括以下几种:

  • 数据段:存储表的实际行数据。
  • 索引段:存储二级索引的数据。
  • 回滚段:存储事务的撤销日志,用于回滚和MVCC。

3. 区(Extent)

区是 InnoDB 分配磁盘存储空间的基本单位,每个区通常为 1MB。区由连续的页组成,用于减少碎片化,提高存储和检索效率。每个区包含 64 个页(每页 16KB)。

4. 页(Page)

页是 InnoDB 存储和管理数据的最小单位,每页大小为 16KB。不同类型的数据存储在不同类型的页中,主要包括:

  • 数据页(Data Page):存储实际行数据。
  • 索引页(Index Page):存储 B+ 树结构的索引数据。
  • 系统页(System Page):存储系统内部信息。
  • 撤销页(Undo Page):存储撤销日志,用于事务回滚。
  • 插入缓冲位图页(Insert Buffer Bitmap Page):存储插入缓冲相关信息。
  • 插入缓冲空闲列表页(Insert Buffer Free List Page):管理插入缓冲的空闲空间。

 

二、事务的原理

        在事务篇1中我们简单的提到过如何保持事务的原子性、一致性、持久性和隔离性,在这章中我们来详细的探讨一下这些都是如何实现的。

2.1 redo log

        redo log又叫重做日志,记录的是事务提交时数据页的物理修改,是用来实现事务的持久性
        该日志文件由两部分组成:重做日志缓冲(redolog buffer)以及重做日志文件(redo log file),前者是在内存中,后者在磁盘中。当事务提交之后会把所有修改信息都存到该日志文件中,用于在刷新脏页到磁盘,发生错误时,进行数据恢复使用。

  • 首先,客户端向MySQL服务器发起一次请求,它包含多条SQL语句,然后MySQL服务器的内存缓存池中会判断其中是否有即将修改的数据
  • 如果在缓存区中没有相关的数据则会向磁盘中加载相关的数据
  • 一段时间后,会通过后台线程将数据刷新到磁盘当中
  • 但是数据的刷新并不是实时的,如果数据刷新出错,此时事务已经提交成功,返回给用户端成功信息,则持久性就没有得到保证
  • redolog的出现保证了持久化

问题:为什么在事务提交之后,不直接持久化到磁盘当中呢?

如果每一次事务提交都将缓存区的数据刷新到磁盘当中会有严重的性能问题,因为在一次事务中会操作大量的随机数据页,这些数据页也会产生大量的随机磁盘IO,性能非常低。

如果先异步刷新redolog日志文件,log日志文件都是顺序追加的,不会有很多的随机IO,他是顺序磁盘IO,这种机制就是WAL机制(先写日志)。

 2.2 undo log

        undo log又叫回滚日志,用于记录数据被修改前的信息,他是保证事务原子性的重要手段,他的作用包含两个:提供回滚 和 MVCC(多版本并发控制)。
        undoloq和redoloq记录物理日志不一样,它是逻辑日志。可以认为当delete一条记录时,undolog中会记录一条对应的insert记录,反之亦然,当update一条记录时,它记录一条对应相反的update记录。当执行rollback时,就可以从undolog中的逻辑记录读取到相应的内容并进行回滚。
        Undo log销毁:undolog在事务执行时产生,事务提交时,并不会立即删除undolog,因为这些日志可能还用于MVCC。
        Undo log存储:undolog采用段的方式进行管理和记录,存放在前面介绍的 rollback segment 回滚段中,内部包含1024个undolog segment。

三、MVCC

3.1 读取数据

mysql读取数据实际上有两种读取模式:当前读和快照读

  • 当前读:每次读取的都是当前最新的数据,但是读的时候不允许写,写的时候也不允许读。对于我们日常的操作,如:select .. lock in share mode(共享锁),select....for update、update、insert、delete(排他锁)都是一种当前读。
  • 快照读:读写不冲突,每次读取的是快照数据,简单的select(不加锁)就是快照读,读取的是记录数据的可见版本,有可能是历史数据,不加锁,是非阻塞读。
    • Read Committed:每次select,都生成一个快照读。
    • Repeatable Read:开启事务后第一个select语句才是快照读的地方,
    • Serializable:快照读会退化为当前读。

隔离级别Repeatable Read下(默认隔离级别可重复读):有可能读取的不是最新的数据
Read Committed隔离级(读提交)别下:快照读和当前读读取的数据是一样的,都是最新的。

3.2 共享锁和排它锁

        共享锁(S锁):共享 (S) 用于不更改或不更新数据的操作(只读操作),如 SELECT 语句。
        如果事务T仅对数据A进行读取,那么会对数据A加上共享锁,之后则其他事务如果要读取数据A的话可以对其继续加共享锁,但是不能加排他锁(也就是无法修改数据)。获准共享锁的事务只能读数据,不能修改数据。
        排他锁(X锁):用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。
        如果事务T对数据A要进行修改,则需要对其添加排它锁,加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。

3.3 MVCC实现原理

1、隐藏字段

隐藏字段可能有三个也可能有两个,这取决于这张表是否有主键,如果有主键则不会生产DB_ROW_ID这个隐藏主键。

 2、undo log版本链

一条在数据库中的数据都一定会有两个隐藏字段,事务ID与回滚指针,每提交一个事务就会有一个修改之前的数据提交到undolog中并且新数据回滚指针指向它。

3、readview

 

接下来看版本链数据访问规则,这readview的核心,也是快照读的核心

 

来看RC隔离级别下具体用法,首先在执行的快照读生产ReadView,ReadView会有上面那四个信息,然后去undolog中对比可使用版本进行访问。 

 

 

讲解到这应该就可以明白了,事务篇1中我们提到过,MySQL的RR隔离级别也能避免大部分的幻读,这就是因为MVCC中readview与undolog日志配合来实现的,RR隔离级别下的快照读定格了一条数据,即使后续有并发事务修改,读取的也是之前快照读定格的那一条数据。

事务篇2InnoDB引擎结束,感谢观看,如有错误欢迎斧正。 

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

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

相关文章

谷粒商城实战(029 业务-订单支付模块-支付宝支付2)

Java项目《谷粒商城》架构师级Java项目实战,对标阿里P6-P7,全网最强 总时长 104:45:00 共408P 此文章包含第305p-第p310的内容 代码编写 前端代码 这里使用的是jsp 在这里引用之前配置的各种支付信息 在AlipayConfig.java里 这里是调用阿里巴巴写…

【onnx问题解决】关键词:found at least two devices、torch.onnx.export

关键词:Expected all tensors to be on the same device, but found at least two devices, cpu and cuda:0! 报错: [34m[1mONNX:[0m export failure ❌ 3.8s: Expected all tensors to be on the same device, but found at least two devices, cpu an…

【R语言】获取任意颜色的HTML 颜色代码、十六进制颜色代码、 RGB代码

网站来源: https://htmlcolorcodes.com/ 界面如下所示: 通过鼠标任意选择不同的颜色,就能获取该色的十六进制代码、RGB代码等。 除此之外,还提供了一些常用颜色的便捷选项,如下: 任意选择一种颜色,即可出…

Java开发快速入门

Java执行流程分析 .java文件 **(源文件)** ---javac编译--->.class文件 **(字节码文件)** ---java运行--->结果 运行的本质: .java文件称之为源文件 .class文件称之为字节码文件 什么是编译 javac Hello.java 1. 有了java源文件, 通过编译器将其编译成JVM可以识别的…

【吊打面试官系列】Java高并发篇 - AQS 支持几种同步方式 ?

大家好,我是锋哥。今天分享关于 【AQS 支持几种同步方式 ?】面试题,希望对大家有帮助; AQS 支持几种同步方式 ? 1、独占式 2、共享式 这样方便使用者实现不同类型的同步组件,独占式如 ReentrantLock&…

C语言动态顺序表结构的创建、初始化结构、尾插、尾删、头插、头删、指定位置插入、指定位置删除、找指定数值下标等的介绍

文章目录 前言一、 结构创建二、 初始化结构三、 打印动态顺序表四、 销毁动态顺序表五、 尾插六、尾删七、 头插八、 头删九、指定位置插入十、指定位置删除十一、找指定数值下标总结 前言 C语言动态顺序表结构的创建、初始化结构、尾插、尾删、头插、头删、指定位置插入、指…

Java 实验12 线程同步与通信

(一)实验目的 1、掌握JAVA中多线程的实现方法; 2、重点掌握多线程的同步与通信机制; 3、熟悉JAVA中有关多线程同步与通信的方法 ; 4、能使用多线程机制解决实际应用中的线程同步与通信问题。 (二&…

【社会信用体系1003】 企业违规新解:社会信用环境改善的实证分析!

今天给大家分享的是来自于国内顶级期刊金融研究2023年发表论文——《社会信用环境改善降低了企业违规吗?——来自“中国社会信用体系建设”的证据》所用到的重要数据集,该文章从企业层面探讨了社会信用系统建设对企业违规行为的影响,更精准地…

Srping 历史

一、History of Spring and the Spring Framework Spring came into being in 2003 as a response to the complexity of the early J2EE specifications. While some consider Java EE and its modern-day successor Jakarta EE to be in competition with Spring, they are …

小白不知道怎么投稿?记住这个好方法

作为一名单位信息宣传员,我最初踏上这条道路时,满心憧憬着通过文字传递我们单位的精彩瞬间,让社会听见我们的声音。然而,理想与现实之间的距离,却在一次次邮箱投稿的石沉大海中渐渐清晰。那时的我,像所有“小白”一样,以为只要用心撰写稿件,通过电子邮件发给各大媒体,就能收获满…

亚马逊云主管马特·加尔曼面临压力,致力于在人工智能领域赶超竞争对手

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Learning Deep Intensity Field for Extremely Sparse-View CBCT Reconstruction

摘要 稀疏视图锥束CT(CBCT)重建是降低辐射剂量和临床应用的一个重要方向,以往基于体素的重建方法将CT表示为离散体素,由于使用3D解码器,导致存储要求高和空间分辨率有限。我们将CT体积表示为连续强度场,并…

全面解析Java.lang.ClassCastException异常

全面解析Java.lang.ClassCastException异常 全面解析Java.lang.ClassCastException异常:解决方案与最佳实践 🚀📚摘要引言1. 什么是Java.lang.ClassCastException?代码示例 2. 报错原因2.1 类型不兼容2.2 泛型类型擦除2.3 接口和实…

【C++】STL快速入门基础

文章目录 STL(Standard Template Library)1、一般介绍2、STL的六大组件2.1、STL容器2.2、STL迭代器2.3、相关容器的函数vectorpairstringqueuepriority_queuestackdequeset, map, multiset, multimapunordered_set, unordered_map, unordered_multiset, …

Autodesk Flame 2025 for Mac:视觉特效制作的终极利器

在数字时代,视觉特效已经成为电影、电视制作中不可或缺的一部分。Autodesk Flame 2025 for Mac,这款专为视觉特效师打造的终极工具,将为您的创作提供无尽的可能。 Autodesk Flame 2025 for Mac拥有强大的三维合成环境,能够支持您…

stm32通过esp8266连接阿里云平台代码讲解

连接服务器 首先,按照一定的规则,获取连接阿里服务器所需要的ClientID(客户端D)、Username(用户名)、Passward(密码),ServerIP(域名),ServerPort&#xff08…

Qt | QTabBar 类(选项卡栏)

01、上节回顾 Qt | QStackedLayout 类(分组布局或栈布局)、QStackedWidget02、简介 1、QTabBar类直接继承自 QWidget。该类提供了一个选项卡栏,该类仅提供了一个选项卡, 并没有为每个选项卡提供相应的页面,因此要使选项卡栏实际可用,需要自行为每个选项卡设置需要显示的页…

冯 • 诺依曼体系结构和操作系统

目录 冯诺依曼体系结构基于冯诺依曼体系数据的高效流转数据流转示例操作系统(Operator System)操作系统(Operator System)层次结构硬件部分系统软件部分用户部分 管理——先描述,再组织 就一个程序而言,需要在计算机中运行的才能实现它的价值&#xff0c…

jmeter发送webserver请求和上传请求

有时候在项目中会遇到webserver接口和上传接口的请求,大致参考如下 一、发送webserver请求 先获取登录接口的token,再使用cookie管理器进行关联获取商品(webserver接口),注意参数一般是写在消息体数据中,消息体有点像HTML格式 执…

调整GIF图大小的方法是什么?分享4个

调整GIF图大小的方法是什么?在数字化时代,GIF以其独特的动图魅力,成为了网络交流中不可或缺的一部分。无论是社交媒体、博客文章还是工作汇报,一个恰到好处的GIF图往往能有效吸引观众的注意,传递信息,但过大…