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

(Mysql)MVCC、Redo Log 与 Undo Log

1. MVCC(多版本并发控制)

概念
MVCC(Multi-Version Concurrency Control)是一种数据库并发控制机制,用于解决 读写冲突,提高数据库并发性能。MySQL InnoDB 存储引擎使用 MVCC 来实现 非阻塞读(即读取时不加锁)。

核心原理

  • 每行数据在内存中有多个版本。

  • 每个版本包含两个隐藏列:

    • trx_id:记录创建该版本的事务 ID。

    • roll_pointer(或 undo_pointer):指向旧版本 Undo Log。

  • 读取数据时,事务根据 自己的快照版本 决定看到哪个版本的数据。

作用

  1. 支持 一致性读(Consistent Read)

  2. 避免读操作阻塞写操作

  3. 与事务隔离级别结合使用(如 Repeatable Read)

举例

  • 事务 A 读取数据时看到的版本是事务开始时的快照

  • 事务 B 更新同一行数据时,会生成新版本,并在 Undo Log 中保存旧版本

  • 事务 A 仍然看到旧版本,不会被阻塞


2. Redo Log(重做日志)

概念
Redo Log 是 InnoDB 的 物理日志,用于 保证事务的持久性(Durability)

特点

  • 顺序写入磁盘,性能高

  • 数据写入前先写 Redo Log,再刷入数据页(Write-Ahead Logging)

  • 崩溃恢复时,通过 Redo Log 恢复已提交事务的数据

顺序流程(插入数据示例)

  1. 事务写入 Redo Log(WAL,顺序追加)

  2. 数据页写入缓冲池

  3. 事务提交时,Redo Log 刷盘(保证持久性)

作用

  • 崩溃恢复:只要 Redo Log 存在,已提交的数据可以恢复

  • 提高写入性能:顺序写比随机写快


3. Undo Log(回滚日志)

概念
Undo Log 是 InnoDB 的 逻辑日志,用于 事务回滚MVCC 版本管理

特点

  • 每条修改操作都会记录 Undo Log

  • 保存的是旧数据版本

  • 写操作失败或事务回滚时,用 Undo Log 恢复数据

作用

  1. 事务回滚:事务出错时,可通过 Undo Log 回到操作前状态

  2. MVCC 读:一致性读时,事务可通过 Undo Log 获取旧版本数据

示例

  • 数据库原值:A = 10

  • 事务修改:A = 20

  • Undo Log 保存旧值 A = 10

  • 事务回滚时,用 Undo Log 恢复 A = 10


4. Redo Log vs Undo Log

特性Redo LogUndo Log
类型物理日志逻辑日志
存储位置磁盘顺序写内存 + 磁盘
用途崩溃恢复回滚、MVCC版本读取
记录内容新数据旧数据
持久性持久化(保证事务提交)临时(事务回滚后可释放)

5. 总结

  • MVCC:保证高并发下的一致性读,靠 Undo Log 保存历史版本

  • Redo Log:保证事务提交的持久性,顺序写入磁盘

  • Undo Log:支持事务回滚和 MVCC 版本管理

理解技巧

  • Redo Log = Ctrl+S(存储最新修改,保证不会丢)

  • Undo Log = Ctrl+Z(保存历史版本,可以撤回操作)

  • MVCC = 时间旅行(每个事务看到自己时间点的版本)

http://www.xdnf.cn/news/19637.html

相关文章:

  • 《探索C++11:现代C++语法的性能革新(上篇)》
  • C++11 ——— lambda表达式
  • 前端必看:为什么同一段 CSS 在不同浏览器显示不一样?附解决方案和实战代码
  • 血缘元数据采集开放标准:OpenLineage Guides 使用 Apache Airflow® 和 OpenLineage + Marquez 入门
  • 使用Spring Boot对接印度股票市场API开发实践
  • Linux初始——Vim
  • [VLDB 2025]阿里云大数据AI平台多篇论文被收录
  • Matrix-Breakout: 2 Morpheus靶场渗透
  • docker本地部署dify,nginx80端口占用的报错
  • 环境搭建汇总
  • Burp Suite 插件 | 提供强大的框架自动化安全扫描功能。目前支持1000+POC、支持动态加载POC、指定框架扫描。
  • 代码随想录刷题Day47
  • 前端测试深度实践:从单元测试到E2E测试的完整测试解决方案
  • 医疗AI时代的生物医学Go编程:高性能计算与精准医疗的案例分析(八)
  • 华宇TAS应用中间件与长城科技两款产品完成兼容互认证
  • 卷积神经网络训练全攻略:从理论到实战
  • 矩阵中寻找好子矩阵
  • 解决爬虫IP限制:Selenium隧道代理完整解决方案
  • 【git】解决Failed to connect to github.com port 443: Timed out
  • 如何修复Lyra Starter Game的按键绑定功能?
  • 智能运维新范式:自动化如何提升企业IT效率
  • 二叉树OJ习题
  • Azure AI Search构建RAG的优化点
  • 动态配置最佳实践:Spring Boot 十种落地方式与回滚审计指南(含实操与避坑)
  • Hello World背后的秘密:详解 C++ 编译链接模型
  • 【重学MySQL】九十三、MySQL字符集与比较规则完全解析
  • Python轻量化革命:用MicroPython构建边缘智能设备
  • 【开题答辩全过程】以 基于SpringBoot的流浪猫狗领养系统为例,包含答辩的问题和答案
  • Unity学习----【数据持久化】二进制存储(二)--文件流
  • 大模型RAG项目实战:Milvus向量数据库