当前位置: 首页 > news >正文

mysql事务以及MVCC相关原理

一.事务
提及事务,就绕不开事务的四大特性:原子性,一致性,隔离性,持久性。

事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。

特性

原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。

一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。

隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。

持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

在事务的四大特性中,原子性,一致性,持久性通过mysql中的redo log 和undo log实现,而隔离性则通过锁和MVCC(多版本并发控制)实现,下面是具体的原理。

二. redo log

解释:重做日志,记录的是事务提交时数据页的物理修改,是用来实现事务的持久性。

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

Redo log是InnoDB用来保证事务持久性的机制,他的核心作用是记录数据页修改前的操作,数据库崩溃后可以通过redo log恢复数据,并实现WAL(Write-Ahead Logging)机制-> 日志先落盘,数据页后落盘。

Redo log通常是通常是物理日志,记录的是数据页的物理修改,而不是某一行或某几行修改成怎样怎样,它用来恢复提交后的物理数据页(恢复数据页,且只能恢复到最后一次提交的位置)。

SQL执行后,修改Buffer Pool中的数据页,生成redo log,再写入到redo log buffer中,数据在redo log buffer时位于内存中,此时事务并未提交,但可以落盘,Redo log的刷盘时机不仅仅时事务commit,常见的刷盘时机有commit;redo log buffer 空间不足导致部分日志刷盘;后台线程周期性刷盘,例如InnoDB每秒会触发一次刷盘;当有checkpoint时,checkpoint在一定程度上代表了刷到磁盘时日志所处的LSN位置。

在这里为什么不直接把Buffer Pool的数据页写入磁盘呢?这就涉及到数据库设计的核心,没有redo log时,写入磁盘为随机IO写入,性能非常差,且当事务涉及到多个数据页时,如果直接刷盘,IO巨大。redo log的核心思想是用顺序写日志代替随机写数据页,这是顺序IO,速度极快。

三.Undo Log
基本概念:

undo log有两个作用,提供回滚和MVCC,且undo log是采用段(segment)的方式来记录的,每个undo操作在记录的时候占用一个undo log segment。

以上只是个人的浅显理解,可以参考:
https://www.cnblogs.com/f-ck-need-u/p/9010872.html
个人认为大佬讲的非常详细

四. MVCC以及实现原理

在介绍MVCC及其实现原理前,我们先了解几个概念。

4.1 MVCC概念

全称 Multi-Version Concurrency Control,多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突,快照读为 MySQL 实现 MVCC 提供了一个非阻塞读功能。MVCC 的具体实现,还需要依赖于数据库记录中的三个隐式字段、undo log 日志、readView。

4.2 快照读

简单的select(不加锁)就是快照读,快照读,读取的是记录数据的可见版本,有可能是历史数据,不加锁,是非阻塞读。
Read Committed:每次select,都生成一个快照读。
Repeatable Read:开启事务后第一个select语句才是快照读的地方。
Serializable:快照读会退化为当前读。

4.3 当前读

读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。对于我们日常的操作,如:select … lock in share mode(共享锁),select … for update、update、insert、delete(排他锁) 都是一种当前读。

4.4 三个隐式字段
MVCC的实现需要依赖三个隐式字段,查看表结构的隐式字段可以通过 idb2sdi 表空间名 查看

4.5 undo log 日志和undo log 日志链
上面已经介绍过undo log日志,这里就不再过多赘述基础概念。undo log在MVCC中主要体现在下面几点


不同事务或相同事务对同一条记录进行修改,会导致记录中的undo log生成一条记录版本链条,链表的头部是最新的旧记录,链表尾部是最早的旧纪录。

4.6 ReadView(读视图)
ReadView(读视图)是快照读sql执行MVCC提取数据的依据,记录并维护系统当前活跃的事务(未提交的)id。

包括四个核心字段

附:ReadView中的活跃事务id集合(m_ids)的范围是生成ReadView时刻,所有已开始但未提交的读写事务id

版本链数据访问规则

对于不同的数据库隔离级别,生成的ReadView的时机也不同:
READ COMMITTED:在事务中每一次执行快照读时生成 ReadView。
REPEATABLE READ:仅在事务中第一次执行快照读时生成 ReadView,后续复用该 ReadView。

4.6.1 RC隔离级别的快照读实现原理

4.6.2 RR隔离级别的快照读实现原理

无非就是看当前事务的id和版本链数据访问规则对比,不成立就继续往undo log日志链由早到晚对比,直到找到符合可读性的事务版本,读取对应版本的数据。在RC隔离级别中,每次事务执行生成的读视图不同,RR级别相同。

http://www.jsqmd.com/news/496789/

相关文章:

  • ubuntu工具之可视化录制的bag数据——PlotJuggler(ROS1版本下载安装)
  • 2026 年国内优质靠谱化工原料直销厂家实力盘点 - 深度智识库
  • 告别熬夜苦写论文:8款AI工具10分钟出万字,降重改稿全搞定 - 麟书学长
  • 代码随想录算法训练营day15| 110.平衡二叉树 (优先掌握递归)、 257. 二叉树的所有路径 (优先掌握递归)、 404.左叶子之和 (优先掌握递归)、 222.完全二叉树的节点个数(优先掌握
  • 第4章,[标签 Win32] :加入滚动条的 SysMets
  • 2026年玻璃钢盐酸储罐厂家推荐:玻璃钢酸碱储罐/卧式玻璃钢储罐/FRP/PP储罐/现场缠绕玻璃钢储罐/大型玻璃钢储罐专业供应商精选 - 品牌推荐官
  • 2026年合肥寻猫服务费用构成与价值解析 - 2026年企业推荐榜
  • 一篇关于mysql迁移达梦后相关sql的优化记录
  • [工具] 影子去除工具,可以批量去除影子,自动裁切透明,自动更新偏移坐标
  • Vue2框架基础配置逻辑和表单双向绑定
  • 2026不锈钢组合水箱应用白皮书:不锈钢保温水箱/不锈钢冲压板/不锈钢拼装压模板/不锈钢方型水箱/不锈钢材料/选择指南 - 优质品牌商家
  • C 语言 I/O 缓冲区详解:彻底解决 printf 不输出、scanf 读错问题
  • c++一些刷题笔记,结构
  • Polkadot 验证人节点升级实战 | 备用节点切换、会话密钥交接零宕机完整教程
  • 小学子讲技术 - OpenClaw 沙箱集成详解
  • 操作系统红蓝对抗:从页表到调度器的血性博弈
  • 小学子讲技术 - OpenClaw 配置与安全详解
  • 2026年云南PC耐力板实力厂商盘点:技术、案例与选择指南 - 2026年企业推荐榜
  • 初识数据结构:排序算法
  • 网络安全学习4
  • 2026被动防护网选型指南:五大厂商技术路线与市场格局深度解析 - 2026年企业推荐榜
  • 文件系统红蓝对抗:从ext4到ZFS的数据持久性战争
  • VirtualLab:Ince高斯模式
  • JetBrains IDEs官宣 实验性 AI 功能:Recap 与 Insights 详解
  • 网络协议红蓝对抗:从TCP重传到QUIC的可靠性战争
  • springboot+vue社区疫情返乡管控系统--毕业论文
  • 宝塔面板下Laravel开发环境的高效配置与调试技巧
  • SpringBoot3接口优化:一行注解搞定字典与关联字段翻译,告别冗余循环
  • 【小程序】✈️一口气用AI肝了50+功能的小程序(已上线)
  • 一次线上事故,我学到了事件驱动架构的5个教训