第74讲:MySQL数据库InnoDB存储引擎事务:Redo Log与Undo Logo的核心概念

文章目录

    • 1.InnoDB引擎中的逻辑存储结构
    • 2.事务的基本概念
    • 3.Redo log的核心概念
      • 3.1.什么是Redo log
      • 3.2.如果没有redo log面临的问题
      • 3.3.使用redo log之后是怎样的流程
    • 4.Undo log的核心概念

1.InnoDB引擎中的逻辑存储结构

InnoDB存储引擎的逻辑结构分为以下几层:

  • TableSpace:表空间

    • 表空间是InnoDB存储引擎逻辑结构中的最高层,如果开启了innodb_file_per_table参数,那么每张表都会有一个表空间文件(xxx.ibd),在一个MySQL实例中可以对应多个表空间,表空间用于存储行数据以及索引数据。
    • 在表空间中可以包含多个Segment段。
  • Segment:段

    • 表空间就是由很多个段组成的,分为数据段、索引段、回滚段。
    • InnoDB是索引来组织表的,数据段就是B+树的叶子节点,叶子节点中包含的是表中的每一条数据,索引段是B+树结构中的非叶子节点,非叶子节点中记录的都是索引元素。
  • Extent:区

    • 区是表空间中的单元结构,每个区的固定大小为1M,一个区中会有很多个页,默认情况中,InnoDB存储引擎页的大小为16KB,因此一个区中一共有64个连接的页。
  • Page:页

    • 页是InnoDB存储引擎在磁盘管理中最小的单元,每个页的大小为16KB,为了保证页的连续性,InnoDB存储引擎每次会从磁盘中申请4-5个区,每个页下又拥有很多个行。
    • 页的上层是区,一个区中可以包含64个页,每次页需要的4-5个区,都是从区中申请的。
  • Row:行

    • InnoDB存储引擎是面向行的,也就是说数据时安装行进行存放的,在每一行中除了定义表的所有字段外,还包含Trxid和roll pointer两个隐藏的字段。
    • Trx_id:每次对某条记录进行改动时,将对应的事务id赋值给trx_id作为隐藏列。
    • Roll_pointer:每次对某条记录进行改动时,都会将旧版本的数据写入到undo日志中,这个隐藏列相当于一个指针,可以通过这个指针来找到记录被修改前的数据。

image-20220524215923977

2.事务的基本概念

事务指的是一组操作的集合,事务会把集合中所有的操作看成是一个整体,一起向数据库提交这些操作,或者撤销这些操作,这些操作可以是增加数据、修改数据、插入数据、查询数据,但是这一个集合中的所有操作必须要么全部成功,要么全部失败。

事务的重点概念就是:要么全部执行成功、要么全部执行失败。

事务这种操作经常应用于银行、金融等业务场景,只要涉及金额、交易等这类场景,就需要用到事务操作。

事务的四大特性分别是原子性、一致性、隔离性、持久性。

  • 原子性(Atomicity):事务是不可分割的最小操作单元,事务里的多个操作单元,要么全部执行成功,要么全部执行失败。
  • 一致性(Consistency):事务完成时,所有的数据都保持一致的状态,以转账场景为例,一旦提交事务后,转账双方的金额变化必须符合业务逻辑,小明余额减1000元,小红余额就必须加1000元,数据要保持一致状态。
  • 隔离性(Isolation):数据库系统提供事务的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行,在很多场景下,会有多个事务同时对一个数据表进行操作,此时有了隔离机制,事务A运行的时候并不会影响事务B的运行。
  • 持久性(Durability):事务一旦提交或者回滚后,对于数据库的数据改变将是永久性的,数据都会被写入到磁盘中。

我们研究事务的原理时,主要研究InnoDB引擎如何保证事务的四大特性的。

对于事务的四大特性,实际上是分为两个部分的,其中原子性、一致性、持久性是由InnoDB中的redo log日志和undo log日志来保证的。而隔离性是通过数据库中的锁加上MVCC来保证。

下面我们重点来讲解redo log和undo log。隔离性中的MVCC放在下一篇详细讲解。

redo log主要是将事务提交之后的数据写入到redo log日志文件中,用于数据的持久化或者数据恢复。

undo log主要是将事务提交之前的数据写入到undo log日志文件中,当事务回滚时会从这里读取数据。

事务的原子性由undo log日志保障,持久性由redo log日志保障,一致性由undo log和redo log保障,隔离性由锁+MVCC保障。

3.Redo log的核心概念

3.1.什么是Redo log

redo log称为重做日志,在redo log中记录的是事务提交时数据页的物理修改,所有事务提交时的数据都会记录在redo log中,用来实现事务的持久性。

redo log日志由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log file),前者是在内存中存放,后者在磁盘中存放,当事务提交之后,会把事务提交后所有的修改信息都保存到redo log中,当刷新脏页到磁盘发送错误时,可以通过redo log进行数据的恢复。

3.2.如果没有redo log面临的问题

在InnoDB存储引擎中分为内存结构和磁盘结构,在内存结构中的主要区域就是Buffer Pool缓冲池了,在缓冲池中会有很多个数据页,数据最终是要写在磁盘进行持久化的。

当我们通过一个事务执行多个增删改的操作时,InnoDB存储引擎首先会操作缓冲池中的数据,如果缓冲池中没有我们要操作的数据,那么会通过后台线程从磁盘中将要操作的数据加载到缓冲池中进行缓存,然后由事务操作缓冲池中的数据,数据被修改后,所在的数据页我们就会称为脏页,脏页会在一定的时机,通过后台线程将数据刷新到磁盘中,从而保证缓冲区和磁盘的数据是一致的,保证数据的持久性。

但是缓冲区的脏页数据并不是实时刷新的,而是通过一段时间之后将缓冲区的数据刷新到磁盘中,如果在刷新磁盘的过程中出错了,但是提示用户事务提交成功了,最终数据并没有持久化,这就出现问题了,事务的持久性没有得到保障。

image-20220625084647646

3.3.使用redo log之后是怎样的流程

为了避免事务的持久性出现的问题,在INnoDB存储引擎中提供了一份日志redo log。

有了redo log之后,当对缓冲池中的数据进行增删改之后,会将数据页的变化记录在redo log buffer缓冲区中,当事务提交之后,会将redo log buffer中的数据刷新到redo log的磁盘文件中。

当一段时间之后要刷新缓冲区的脏页数据到磁盘时,发生了错误,此时就可以借助redo log进行的数据恢复,这样就保证了事务的持久性。

当脏页数据成功刷新到磁盘,此时redolog就没有作用了,可以被回收,所以redo log是有大小限制的,当超过限制后会循环写入,覆盖掉最早的数据。

image-20220625083845139

我们可以再思考一个问题,为什么每次提交时候之后,要刷新redo log buffer中的数据导磁盘,并不是直接将buffer pool中的脏页数据刷新到磁盘呢?其实也非常简单,因为操作数据一般都是随机读写磁盘的,并不是顺序读写磁盘,随机读写磁盘对I/O的消耗很高,而redo log在磁盘中是日志文件,所以是顺序写入的,顺序写入的效率要远高于随机写。

这种先写日志也有名词:WAL(Write-Ahead Logging)

4.Undo log的核心概念

undo log日志是回滚日志,主要记录事务提交之前的数据信息,当事务需要回滚时会从undo log日志文件中读取旧的数据内容。另外在MVCC多版本并发控制中也会用到undo log。

undo log和redo log记录物理日志不同,undo log记录的是逻辑日志,因为是用于回滚数据时使用,所以undo log会将一条delete语句在undo log中记录一条对应的insert语句,当是update语句时,则在undo log中记录一条相反的update语句,当要执行回滚操作时,就可以从undo log中读取相应的内容并进行回滚。

当事务提交后并不会立即删除undo log,这些日志还可能应用于MVCC。

undo log采用段的方式进行管理和记录,存放在rollback segment回滚段中,内部包含了1024个undo log segment。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Distilling Knowledge via Knowledge Review 中文版

Distilling Knowledge via Knowledge Review: 通过知识回顾提炼知识 摘要 知识蒸馏将知识从教师网络传输到学生网络,旨在极大提高学生网络的性能。先前的方法大多集中在提出特征转换和损失函数,用于同一级别特征之间的改进效果。我们不同地…

第二十一章 网络通信

21.1 网络程序设计基础 网络程序设计编写的是与其他计算机进行通信的程序。 局域网与互联网 服务器是指提供信息的计算机或程序,客户机是指请求信息的计算机或程序。网络用于连接服务器与客户机,实现两者间的相互通信。 网络协议 网络协议规定了计算…

集成开发环境PyCharm的使用【侯小啾python基础领航计划 系列(三)】

集成开发环境 PyCharm 的使用【侯小啾python基础领航计划 系列(三)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹…

企业如何结合数字化技术实现精益生产

企业要想长远良性发展,就必须不断追求生产效率的极致,才能不断对抗各方各面带来的压力。结合国家大环境趋势,绿色生产已然成为了国家关注的重点,所以老旧耗能的企业生产模式注定会被时代所淘汰。企业只有紧跟国家的发展步伐&#…

QScrollArea的使用

参考&#xff1a; QT的自动滚动区QScrollArea的用法&#xff0c;图文详解-CSDN博客 demo: QScrollArea *scrollArea new QScrollArea;QWidget *pWgt new QWidget();QHBoxLayout *pLayout new QHBoxLayout();for(int i 0; i < 100; i){QPushButton *pBtn new QPushB…

【hacker送书第9期】算法训练营(入门篇)

第9期图书推荐 内容简介作者简介精彩书评图书目录概述参与方式 内容简介 本书以海量图解的形式&#xff0c;详细讲解常用的数据结构与算法&#xff0c;又融入大量的竞赛实例和解题技巧。通过对本书的学习&#xff0c;读者可掌握12种初级数据结构、15种常用STL函数、10种二叉树和…

java基础之循环

Java中有三种主要的循环结构&#xff1a; while 循环do…while 循环for 循环 1、while循环 1.1、结构 while( 布尔表达式 ) { //循环内容 } 1.2、实例 public class TestWhile {public static void main(String[] args) {int x 1;while (x<10){System.out.println("…

面试官:说说webpack的构建流程?

面试官&#xff1a;说说webpack的构建流程? 一、运行流程 webpack 的运行流程是一个串行的过程&#xff0c;它的工作流程就是将各个插件串联起来 在运行过程中会广播事件&#xff0c;插件只需要监听它所关心的事件&#xff0c;就能加入到这条webpack机制中&#xff0c;去改变…

万兆单模光模块SFP-XG-LX:高速长距离数据传输利器

随着企业和个人对高速数据传输的需求不断增加&#xff0c;网络设备需要不断更新换代&#xff0c;以满足更高速、更远距离的传输要求。万兆单模光模块SFP-XG-LX作为一种基于光纤传输的高速网络模块&#xff0c;适用于长距离的数据传输。本文将介绍万兆单模光模块SFP-XG-LX的特点…

CSS单位vmin、vmax

在前端项目中使用到图片或者一些其他的需要适应视口宽度的地方时候&#xff0c;我们可以使用vmin或者vmax这两个属性。我们来看一下这两个属性在MDN上面的定义 实例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">…

婴儿专用洗衣机有必要吗?宝宝洗衣机洗衣服

相信各位宝爸宝妈都有同样的苦恼&#xff0c;那就是宝宝的衣服该怎么来洗宝宝每天都有一大堆衣物和各种巾要洗&#xff0c;如果单纯用手洗&#xff0c;真的是一个很大的工程&#xff0c;将宝宝的衣服丢进去家庭用的洗衣机&#xff0c;宝宝稚嫩的皮肤又怕会被细jun感染到&#x…

04_W5500_TCP_Server

上一节我们完成了TCP_Client实验&#xff0c;这节使用W5500作为服务端与TCP客户端进行通信。 目录 1.W5500服务端要做的&#xff1a; 2.代码分析&#xff1a; 3.测试&#xff1a; 1.W5500服务端要做的&#xff1a; 服务端只需要打开socket&#xff0c;然后监听端口即可。 2…

uniapp中解决swiper高度自适应内容高度

起因&#xff1a;uniapp中swiper组件swiper 标签存在默认高度是 height: 150px &#xff1b;高度无法实现由内容撑开&#xff0c;在默认情况下&#xff0c;swiper盒子高度显示总是 150px 解决办法思路&#xff1a; 动态设置swiper盒子的高度&#xff0c;故需要获取swiper-item盒…

您距离一个成熟安全的 DevOps 平台,只差一个迁移

目录 功能丰富&#xff0c;开箱即用 安全保障&#xff0c;质效并行 私有部署&#xff0c;自主可控 月度发版&#xff0c;持续迭代 本土化团队&#xff0c;企业级支持 迁移指南 从 Gitee 迁移到极狐GitLab 从 SVN 迁移到极狐GitLab 从 GitHub 迁移到极狐GitLab 历经 14…

2024最新电脑系统清理软件哪个好用?

基本上&#xff0c;不管是win版还是Mac版的电脑&#xff0c;其装机必备就是一款电脑系统清理软件&#xff0c;就比如Mac&#xff0c;目前在市面上&#xff0c;电脑系统清理软件是非常多的。 对于不熟悉系统的用户来说&#xff0c;使用一些小众工具&#xff0c;往往很多用户都不…

家用超声波清洗机哪个牌子好?一起来看、值得推荐超声波清洗机

家用超声波清洗机可以干嘛呢&#xff1f;最常见的就是来清洗眼镜。眼镜党朋友应该经常接触超声波清洗机&#xff0c;它常出现在眼镜店中&#xff0c;眼镜店老板帮顾客清洗眼镜&#xff1b;也会出现在工业领域、医疗领域等&#xff0c;超声波清洗机使用范围还是挺广的&#xff0…

【SpringCloud】通过Redis手动更新Ribbon缓存来解决Eureka微服务架构中服务下线感知的问题

文章目录 前言1.第一次尝试1.1服务被调用方更新1.2压测第一次尝试1.3 问题分析1.4 同步的不是最新列表 2.第二次尝试2.1调用方过滤下线服务2.2压测第二次尝试2.3优化 写到最后 前言 在上文的基础上&#xff0c;通过压测的结果可以看出&#xff0c;使用DiscoveryManager下线服务…

基于c++版本链栈改-Python思维总结

##栈部分-&#xff08;叠猫猫&#xff09; ##抽象数据类型栈的定义&#xff1a;是一种遵循先入后出的逻辑的线性数据结构。 ##栈的链式表示 使用链表实现栈时&#xff0c;我们可以将链表的头结点视为栈顶&#xff0c;尾结点视为栈底。 在进行插入元素的时候我们只需要把结点…

逆水行舟!浅谈24届双非本科秋招

逆水行舟&#xff01;浅谈24届双非本科的秋招 逆水行舟&#xff01;浅谈24届双非本科的秋招0、背景 -- 写下本文的初衷1、实习 -- 秋招的预备战役1.1 科大讯飞1.2 三七互娱 2、秋招 -- 一场没有硝烟的战争3、总结 -- 做好自己想做的事情 0、背景 – 写下本文的初衷 如题&#…

使用 React 和 ECharts 创建地球模拟扩散和飞线效果

在本博客中&#xff0c;我们将学习如何使用 React 和 ECharts 创建一个酷炫的地球模拟扩散效果。我们将使用 ECharts 作为可视化库&#xff0c;以及 React 来构建我们的应用。地球贴图在文章的结尾。 最终效果 准备工作 首先&#xff0c;确保你已经安装了 React&#xff0c;并…