第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。

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

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

相关文章

【计算机网络笔记】物理层——信道与信道容量

系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…

04_W5500_TCP_Server

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

Leetcode 92 反转链表II

反转链表II 题解1 一遍遍历&#xff08;穿针引线&#xff09; 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 提示&#xff1a; 链表中节点数目…

解决 vite 中 import.meta.globEager is not function 的问题

本人正在重构两年前搭建到一半的博客网站&#xff0c;相关依赖都很陈旧&#xff0c;用到了 npm-check-updates 检测项目可升级依赖&#xff1a; 升级完成后解决完依赖发现控制台报错 import.meta.globEager is not function解决方案&#xff1a; vite版本降至4.3.0 亲测有效&…

3.4 路由器的DHCP配置

实验3.4 路由器的DHCP配置 一、任务描述二、任务分析三、具体要求四、实验拓扑五、任务实施&#xff08;一&#xff09;配置基于接口地址池的DHCP1.交换机的基本配置2.路由器的基本配置3.开启路由器的DHCP服务器功能4.配置路由器接口的DHCP功能5.设置计算机使用DHCP方式获取IP地…

P5 Linux 标准C库函数

目录 前言 01 标准输入、标准输出和标准错误 02 打开文件 fopen() 03 新建文件的权限 04 fclose()关闭文件 05 读文件和写文件 06 库函数 fseek 定位 6.1 lseek的使用 07 ftell()函数 前言 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C_Chen…

【Vue】使用cmd命令创建vue项目

上一篇&#xff1a; node的安装与配置 https://blog.csdn.net/m0_67930426/article/details/134562278?spm1001.2014.3001.5502 目录 一.创建空文件夹专门存放vue项目 二. 查看node , npm 和vue脚手架的版本 三.安装vue脚手架 四.创建vue项目 五.运行项目 一.创建空文件…

Qt将打印信息输出到文件

将打印信息&#xff08;qDebug、qInfo、qWarning、qCritial等&#xff09;输出到指定文件来以实现简单的日志功能。 #include "mainwindow.h" #include <QApplication> #include <QLoggingCategory> #include <QMutex> #include <QDateTime>…

树_二叉搜索树的众树

//给你一个含重复值的二叉搜索树&#xff08;BST&#xff09;的根节点 root &#xff0c;找出并返回 BST 中的所有 众数&#xff08;即&#xff0c;出现频率最高的元素&#xff09;。 // // 如果树中有不止一个众数&#xff0c;可以按 任意顺序 返回。 // // 假定 BST 满足如…

面试题:公司规定所有接口都用 post 请求,这是为什么?

文章目录 前言get 与 post 的区别所有接口都用 post 请求&#xff1f;网友程墨 Morgan网友苏莉安网友大宽宽 前言 最近在逛知乎的时候发现一个有趣的问题&#xff1a;公司规定所有接口都用 post 请求&#xff0c;这是为什么&#xff1f; 看到这个问题的时候其实我也挺有感触的…

Java数据结构之《最短路径》(难度系数100)

一、前言&#xff1a; 这是怀化学院的&#xff1a;Java数据结构中的一道难度偏难(偏难理解)的一道编程题(此方法为博主自己研究&#xff0c;问题基本解决&#xff0c;若有bug欢迎下方评论提出意见&#xff0c;我会第一时间改进代码&#xff0c;谢谢&#xff01;) 后面其他编程题…

西工大计算机学院计算机系统基础实验一(环境配置)

首先&#xff0c;不要焦虑&#xff0c;稳住心态慢慢来&#xff0c;一点一点做&#xff0c;跟着作者把基础打好&#xff0c;比什么都重要。作者曾经经历过这份痛苦&#xff0c;知道它有多么不好受。当初的作者高中之前甚至都没有自己的一台笔记本&#xff0c;上了大学以后学C语言…

qt 5.15.2 主窗体事件及绘制功能

qt 5.15.2 主窗体事件及绘制功能 显示主窗体效果图如下所示&#xff1a; main.cpp #include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);MainWindow w;w.setFixedWidth(600);w.setFixedHeight(6…

java:slf4j、log4j、log4j2、logback日志框架的区别与示例

文章目录 背景SLF4J - 简单日志门面:Log4j - 强大而古老的日志框架:Log4j2 - Log4j的升级版:Logback - Log4j的继任者:比较Springboot集成slf4j、log4j2参考 背景 在Java开发中&#xff0c;日志记录是一个不可或缺的组成部分。为了满足不同的需求&#xff0c;Java社区涌现出多…

xilinx系列FPGA基于VIVADO的pin delay列表生成说明

目录 1 概述2 示例平台3 操作说明4 注意事项 xilinx系列FPGA基于VIVADO的pin delay列表生成说明 1 概述 本文用于讲诉xilinx系列FPGA基于VIVADO的pin delay列表生成说明&#xff0c;以及一些注意事项&#xff0c;为FPGA设计人员探明道路。 Pin delay 即FPGA内部die到pin的延时…

Unirest-Java:Java发起GET、POST、PUT、DELETE、文件上传,文件下载工具类介绍

一、简介 Unirest-Java是一个轻量级的HTTP客户端库&#xff0c;用于在Java应用程序中发送HTTP请求。 它提供了简单易用的API&#xff0c;可以方便地处理GET、POST、PUT、DELETE等HTTP方法。 Unirest-Java支持异步和同步请求&#xff0c;可以轻松地与JSON、XML等数据格式进行…

Linix服务器添加dns解析

Linix开通互联网域名地址出现&#xff0c;如下错误&#xff1a; 需要访问的服务器上添加dns解析 vim /etc/sysconfig/network-scripts/ifcfg-ens192 添加如下配置&#xff1a; DNS1202.96.134.13 重启网卡&#xff1a; systemctl restart network 注意如果是docker服务部署…

软著项目推荐 深度学习的水果识别 opencv python

文章目录 0 前言2 开发简介3 识别原理3.1 传统图像识别原理3.2 深度学习水果识别 4 数据集5 部分关键代码5.1 处理训练集的数据结构5.2 模型网络结构5.3 训练模型 6 识别效果7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习…

Vue实现条件渲染

&#x1f4d1;前言 本文主要是【Vue】——Vue实现条件渲染的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句&am…

电商项目之Web实时消息推送(附源码)

文章目录 1 问题背景2 前言3 什么是消息推送4 短轮询5 长轮询5.1 demo代码 6 iframe流6.1 demo代码 7 SSE7.1 demo代码7.2 生产环境的应用 &#xff08;重要&#xff09; 8 MQTT 1 问题背景 扩宽自己的知识广度&#xff0c;研究一下web实时消息推送 2 前言 文章参考自Web 实时消…