MySQL-Innodb引擎事务原理
文章目录
- 1.事务介绍
- 2 事务特性
- 3. 事务的实现原理
- 4 redo log 保证持久性
- 5 undo log 保证原子性
- 6 MVCC 概念
- 6.1 隐藏字段
- 6.2 版本链
- 6.3 ReadView
- 6.3.1readview 版本控制规则
- 7 隔离性 实现
- 7.2 隔离性- REPEATABLE READ 可重复读下
- 8 一致性
1.事务介绍
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时袋败
2 事务特性
- 原子性(Atomicity): 事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
- 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
- 隔离性(lsolation): 数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的-独立环境下运行
- 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
3. 事务的实现原理
原子性、一致性、持久性主要是通过 redo.log 日志和 undo.logo日志实现的
隔离性 根据锁和MVCC(多版本控制)实现

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

当事务提交时,首先从 ibd文件中io需要更改的数据到 内存中的buffer pool ,在buffer pool中进行数据修改,同时把数据页变化加载到redo log buffer中 ,然后redo log buffer 通过顺序io的方式,刷新到磁盘中的redo log fle文件(增加日志速度更快),即完成事务的提交 ,随后 buffer pool 将随机刷新,将更改后的数据刷新到ibd中,随后如果出现发生crash,则重新读取redo log fle 到buffer pool 完成持久化。
idb 为mysql 存储数据的物理文件
当buffer pool中的dirty page 还没有刷新到磁盘的时候,发生crash,启动服务后,可通过redo log 找到需要重新刷新到磁盘文件的记录;
buffer pool中的数据直接flush到disk file,是一个随机IO,效率较差,而把buffer pool中的数据记录到redo log,是一个顺序IO,可以提高事务提交的速度;
5 undo log 保证原子性
回滚日志,用于记录数据被修改前的信息,作用包含两个:提供回滚和 MVCC(多版本并发控制)。undo log和redo log记录物理日志不一样,它是逻辑日志。可以认为当delete一条记录时,undolog中会记录一条对应的insert记录,反之亦然,当update一条记录时,它记录一条对应相反的update记录。当执行rolback时,就可以从undo og中的逻辑记录读取到相应的内容并进行回滚。
- Undo log销毁: undo log在事务执行时产生,事务提交时,并不会立即删除undo log,因为这些日志可能还用于MVCC。
- Undo log存储:undo log采用段的方式进行管理和记录,存放 是rollback segment回滚段中,内部包含1024个undo loosegment.
6 MVCC 概念
MVCC 全称 Multi-Version (oncurrencyontrol,多版本并发控制。指维护个数据的多个版本,使得读写操作没有冲突,快照读为MySQL实现MVCC提供了一个非阻塞读功能。MVCC的具体实现,还需要依赖于数据库记录中的三个隐式字段、undo log日志、readView。
- 当前读
读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。对于我们日常的操作,如:select… lockin share mode(共享锁),select … for update、 update、insert、delete(排他锁)都是一种当前读
- 快照读
简单的select(不加锁)就是快照读,快照读,读取的是记录数据的可见版本,有可能是历史数据,不加锁,是非阻塞读。
不同隔离级别下的快照读
- Read Committed:每次select,都生成一个快照读。
- Repeatable Read:开启事务后第一个select语句才是快照读的地方
- Serializable:快照读会退化为当前读。
6.1 隐藏字段
在数据库表中除了有 表的属性,还有三个隐藏字段

| 隐藏字段 | 含义 |
|---|---|
| DB TRX ID | 最近修改事务ID,记录插入这条记录或最后一次修改该记录的事务ID。 |
| DB ROLL PTR | 回滚指针,指向这条记录的上一个版本,用于配合undo log,指向上一个版本。 |
| DB ROW ID | 隐藏主键,如果表结构没有指定主键,将会生成该隐藏字段。 |
6.2 版本链
不同事务或相同事务对同一条记录进行修改,会导致该记录的undolog生成一条记录版本链表,链表的头部是最新的旧记录,链表尾部是最
早的旧记录。
undo log记录存储情况
回滚日志,在insert、update、delete的时候产生的便于数据回滚的日志。
- insert的时候,产生的undo log日志只在回滚时需要,在事务提交后,可被立即删除。
- update、delete的时候,产生的undolog日志不仅在回滚时需要,在快照读时也需要,不会立即被删除。
数据库表中隐藏字段 的DB ROLL PTR 列存储这上一个版数据 存 在undo log 中 。从而如同所示 undo log 中的数据形成一个版本链

6.3 ReadView
ReadView(读视图)是 快照读SOL执行时,MVCC提取数据的依据,记录并维护系统当前活跃的事务(未提交的)id。
| 字段 | 含义 |
|---|---|
| m_ids | 当前活跃的事务ID集合 |
| min_trx_id | 最小活跃事务ID |
| max_trx_id | 预分配事务ID,当前最大事务ID+1(因为事务ID是自增的) |
| creator_trx_id | ReadView创建者的事务ID |
6.3.1readview 版本控制规则
注意:当时事务id存储值 数据库表中 隐藏字段的 DB TRX ID 中

不同的隔离级别,生成Readview的时机不同:
READ COMMITTED : 在事务中每一次执行快照读时生成ReadView。
REPEATABLE READ: 仅在事务中第一次执行快照读时生成ReadView,后续复用该ReadView。
7 隔离性 实现

##7.1 隔离性 -读已提交 原理

READ COMMITTED : 在事务中每一次执行快照读时生成ReadView,我们根据ReadView 和undo log ,确定查询的是那条记录
如图所示 事务5 第一次查询时 生成的readVive 根据版本控制规则 ,DB_ROLL_PIR 为DX0003的记录进行匹配 发现不满足版本控制规则,则对undo log 中的下一条记录进行匹配,发现也不满足,继续匹配下一规则,发现满足 第二个规则,查询时则会展示 这条记录。
7.2 隔离性- REPEATABLE READ 可重复读下
可重复读下 流程和RC 模式相同只是在第一次查询时生成快照读 剩下的全部复用第一次的快照读。

8 一致性

相关文章:
MySQL-Innodb引擎事务原理
文章目录1.事务介绍2 事务特性3. 事务的实现原理4 redo log 保证持久性5 undo log 保证原子性6 MVCC 概念6.1 隐藏字段6.2 版本链6.3 ReadView6.3.1readview 版本控制规则7 隔离性 实现7.2 隔离性- REPEATABLE READ 可重复读下8 一致性1.事务介绍 事务是一组操作的集合…...
Linux操作系统学习(了解环境变量)
文章目录环境变量初识除了上述介绍的PATH,还有一些常见的环境变量如:查看环境变量方法 :环境变量的基本概念:本地变量:环境变量初识 环境变量解释起来比较抽象,先看示例: #include <stdio.…...
数据分析思维(六)|循环/闭环思维
循环/闭环思维 1、概念 在很多的分析场景下,我们需要按照一套流程反复分析,而不是进行一次性的分析,也就是说这套流程的结果会成为该流程的新一次输入,从而形成一个闭环,此时的分析思维我们称之为循环/闭环思维。 常…...
C++:类和对象(下)
文章目录1 再谈构造函数1.1 构造函数体赋值1.2 初始化列表1.3 explicit关键字2 static成员2.1 概念2.2 特性3 友元3.1 友元函数(流插入(<<)及流提取(>>)运算符重载)3.2 友元类4 内部类5 匿名对…...
ASP.NET Core MVC 项目 AOP之IResultFilter和IAsyncResultFilter
目录 一:说明 二:IActionFilter同步 三:IAsyncActionFilter异步 一:说明 IResultFilter同步过滤器与IAsyncResultFilter异步过滤器常常被用作于渲染视图或处理结果。 IResultFilter同步过滤器执行顺序: 1:执行控制器中的构造函数,实例化控制器 2:执行具体的Acti…...
jstack排查cpu占用高[复习]
这样就可以看到占用CPU高的代码位置。 总结:就是先查到占用高的应用和具体的线程,然后根据线程到堆积信息查找即可。 不过堆栈信息非十进制,需提前把线程号转为十六进制。 这样就可以看到占用CPU高的代码位置。 总结:就是先查到…...
网络安全-Pyhton环境搭建
网络安全-Pyhton环境搭建 https://www.kali.org/get-kali/#kali-installer-images—kali官网下载地址 python这个东东呢 是目前来说最简单,方便的开源的脚本语言 广泛用于Web开发,AI,网站开发等领域 python要装2和3 为什么要安装两个版本…...
SpringBoot Mybatis 分页实战
pageInfo的属性 pageNum:当前页 pageSize:页面数据量 startRow:当前页首条数据为总数据的第几条 endRow:当前页最后一条数据为总数据的第几条 total:总数据量 pages:总页面数 listPage{}结果集 reasonable …...
计算机断层扫描结肠镜和全自动骨密度仪在一次检查中的可行性
计算机断层扫描结肠镜和全自动骨密度仪在一次检查中的可行性 Feasibility of Simultaneous Computed Tomographic Colonography and Fully Automated Bone Mineral Densitometry in a Single Examination 简单总结: 数据:患者的结肠镜检查和腹部CT检查…...
Java多级缓存是为了解决什么的?
前言 提到缓存,想必每一位软件工程师都不陌生,它是目前架构设计中提高性能最直接的方式。 缓存技术存在于应用场景的方方面面。从网站提高性能的角度分析,缓存可以放在浏览器,可以放在反向代理服务器,还可以放…...
MongoDB--》索引的了解及具体操作
目录 索引—index 索引的类型 索引的管理操作 索引的使用 索引—index 使用索引的原因:索引支持在MongoDB中高效地执行查询。如果没有索引,MongoDB必须执行全集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的文档。这…...
Python open()函数详解:打开指定文件
在 Python 中,如果想要操作文件,首先需要创建或者打开指定的文件,并创建一个文件对象,而这些工作可以通过内置的 open() 函数实现。open() 函数用于创建或打开指定文件,该函数的常用语法格式如下:file ope…...
CentOS Stream 9尝鲜安装教程
作者:IT圈黎俊杰 一、下载CentOS Stream 9安装介质 在CentOS官网可以下载到CentOS Stream 9的安装介质,正面列出ISO介质的下载链接地址: https://download.cf.centos.org/9-stream/BaseOS/x86_64/iso/CentOS-Stream-9-20221019.0-x86_64-dv…...
Ambire AdEx 2023 年路线图
Ambire AdEx 是为简化 web3 显示广告而建立的,领先于时代。到 2023 年,它将专注于服务用户需求,同时保持其作为区块链隐私解决方案的核心,反对传统的数字广告模式。 回顾 2022 年 2022 年,AdEx 网络处理了超过 1 亿次展…...
两种特征提取方法与深度学习方法对比的小型金属物体分类分析研究
本文讨论了用于对包括螺丝、螺母、钥匙和硬币在内的小型金属物体进行分类的两种特征提取方法的效率:定向梯度直方图 (HOG) 和局部二进制模式 (LBP)。首先提取标记图像的所需特征并以特征矩阵的形式保存。使用三种不同的分类方法(非参数 K 最近邻算法、支…...
传奇私服搭建网站的几种方法
搭建网站的几种方法:一些人,连简单的搭建网站都不会,还要请技术帮忙,真是牛B,这里简单介绍下几种办法一:2003系统下,直接使用IIS,这个太简单了,桌面上就有IIS,…...
i.MX8MP平台开发分享(clock篇)- 各类clock的注册
专栏目录:专栏目录传送门 平台内核i.MX8MP5.15.71文章目录 1、关键数据结构1.1 clk_hw1.2 clk_hw_onecell_data2.一个clk的注册过程2.1 fixed clk2.2 pll14xx2.3 fixed factor2.4 mux2.5 composite2.6 gate1、关键数据结构 1.1 clk_hw clk_hw是描述一个时钟信息的最小单元。…...
java ssm计算机系统在线考试平台idea
本系统主要包括以下功能模块学生、教师、班级、考试评阅、在线考试、试题内容、考试等模块,通过这些模块的实现能够基本满足日常计算机系统平台的操作。 本文着重阐述了计算机系统平台的分析、设计与实现,首先介绍开发系统和环境配置、数据库的设计&…...
C语言(字符串函数)
这章的内容记得引用<string.h>头文件 目录 1.strlen() 2.strcat() 3.strncat() 4.strcmp() 5.strncmp() 6.strcpy() 7.strncpy() 8.sprintf() 8.strchr() 9.strpbrk() 10.strrchr() 11.strstr() 1.strlen() 用于统计字符串的…...
Maxwell工作流程详解
要介绍maxwell的工作原理,首先需要讲一下mysql主从复制的原理 mysql主从复制原理: 如上图,左边是master主节点,右边是slave从节点 工作流程: 1.往主节点mysql的数据库中写入数据,产生数据变化,…...
鸿蒙一气总论(七)
第七卷 圣哲观象古今百家思想归一卷首引天地已定,万物已明,文脉已传,人心已证。 天地有真机,万象有运化,世人肉眼观之,茫然不识。 于是古今圣贤、四方哲人,仰观天道、俯察人世, 各以…...
Notify.js性能优化指南:提升通知系统的响应速度
Notify.js性能优化指南:提升通知系统的响应速度 【免费下载链接】notifyjs Notify.js - A simple, versatile notification library 项目地址: https://gitcode.com/gh_mirrors/no/notifyjs 在现代Web应用中,通知系统作为用户交互的重要组成部分&…...
告别网盘限速!3步搞定百度网盘高速下载秘籍
告别网盘限速!3步搞定百度网盘高速下载秘籍 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘的龟速下载而烦恼吗?每次看到那几十KB/s的速…...
GoAmzAI:开源本地化部署,AI赋能亚马逊卖家高效生成运营文案
1. 项目概述:一个面向亚马逊卖家的AI助手最近在和一些做跨境电商的朋友聊天,发现他们每天花在亚马逊店铺运营上的时间,很大一部分都耗在了重复性的文案工作上。从产品标题、五点描述、A页面,到广告文案、客户邮件回复,…...
ARM架构TLB管理机制与RVALE1指令详解
1. ARM架构中的TLB管理机制解析在ARMv8/ARMv9架构中,TLB(Translation Lookaside Buffer)作为内存管理单元(MMU)的核心组件,承担着加速虚拟地址到物理地址转换的关键任务。当CPU需要访问内存时,T…...
告别DCOM配置烦恼:用Python2.7 + OpenOPC的Open模式轻松搞定跨平台OPC-DA数据采集
工业数据采集新范式:Python2.7OpenOPC Gateway的轻量化实践 在工业自动化领域,数据采集系统如同神经末梢,将现场设备的实时状态转化为可分析的数字信号。传统OPC-DA方案依赖Windows平台的DCOM组件,配置复杂度与跨平台限制成为工程…...
从DES到AES:被‘遗忘’的IDEA算法,它的设计思想给现代密码学留下了什么?
从DES到AES:被遗忘的IDEA算法如何塑造现代密码学 1991年诞生的IDEA算法曾被誉为"DES的完美继任者",却在历史舞台上悄然退场。当我们在讨论AES和椭圆曲线加密时,很少有人记得这个瑞士学者设计的算法如何影响了整个加密技术发展轨迹。…...
AI伦理编程实战:从公平性算法到可解释性模型的工程实践
1. 项目概述:当代码开始思考,我们该教它什么? “AI伦理编程”这个词,听起来像是一个技术乌托邦,一个我们只要遵循几条规则就能让机器变得善良的简单任务。但当你真正坐下来,试图将“公平”、“透明”、“无…...
星露谷物语模组加载器SMAPI:免费开源的游戏增强终极指南
星露谷物语模组加载器SMAPI:免费开源的游戏增强终极指南 【免费下载链接】SMAPI The modding API for Stardew Valley. 项目地址: https://gitcode.com/gh_mirrors/smap/SMAPI 星露谷物语模组加载器SMAPI是《星露谷物语》的官方模组API,为这款经典…...
终极Notero使用指南:如何快速实现Zotero与Notion文献同步
终极Notero使用指南:如何快速实现Zotero与Notion文献同步 【免费下载链接】notero A Zotero plugin for syncing items and notes into Notion 项目地址: https://gitcode.com/gh_mirrors/no/notero 在学术研究和工作流管理中,我们常常面临一个共…...
