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

MySQL InnoDB更新流程

1. 事务启动与行定位

  • 事务开始:显式(BEGIN)或隐式启动事务,分配事务ID。

  • 定位数据:通过索引定位需更新的行。若数据页不在缓冲池(Buffer Pool),则从磁盘加载到内存。


2. 加锁与旧数据记录

  • 行级锁:对目标行加排他锁(X锁),防止其他事务并发修改。

  • Undo Log记录:将修改前的数据写入Undo Log,用于事务回滚和MVCC多版本读。


3. 内存数据修改

  • 缓冲池更新:在内存中修改数据行,生成新版本,标记数据页为脏页(Dirty Page)。

  • 索引处理:若涉及索引列,同步更新索引结构(如聚簇索引和二级索引)。


4. Redo Log写入(Prepare阶段)

  • Redo Log生成:记录数据页的物理修改到Redo Log Buffer,状态为PREPARE

  • 持久化保证:事务提交前,Redo Log可能按策略刷盘(如innodb_flush_log_at_trx_commit=1时强制刷盘)。


5. Binlog写入(可选)

  • Binlog记录:若开启Binlog,生成逻辑日志并写入Binlog文件。

  • 两阶段提交(2PC):确保Redo Log与Binlog的一致性:
    1. Redo Log标记为PREPARE

    2. Binlog写入并刷盘。

    3. Redo Log标记为COMMIT


6. 事务提交与锁释放

  • 提交事务:Redo Log状态更新为COMMIT,释放行锁,事务可见性生效。

  • 异步刷盘:脏页由后台线程(如Checkpoint)异步刷回磁盘,不影响事务提交速度。


7. 崩溃恢复机制

  • Redo Log重放:崩溃后通过Redo Log重做未刷盘的脏页修改。

  • Undo Log回滚:未提交的事务通过Undo Log回滚,保证原子性。


关键组件协作

  • 缓冲池(Buffer Pool):减少磁盘IO,提升性能。

  • Undo Log:支持事务回滚和MVCC读视图。

  • Redo Log:确保崩溃恢复时的持久性。

  • Binlog:主从复制和数据归档(逻辑日志)。


流程图解

更新请求│↓
事务启动 → 分配事务ID│↓
加载数据页到Buffer Pool(若未加载)│↓
加行级排他锁(X Lock)│↓
写Undo Log(旧数据备份)│↓
更新内存数据 → 标记脏页│↓
写Redo Log(Prepare状态)│↓
写入Binlog(若开启)│↓
Redo Log标记为Commit│↓
释放行锁│↓
异步刷脏页到磁盘(Checkpoint)

注意事项

  • 性能调优:合理设置innodb_flush_log_at_trx_commitsync_binlog平衡性能与持久性。

  • 锁竞争:长时间未提交的事务可能导致锁等待,需优化事务粒度。

  • MVCC机制:读操作通过Undo Log访问历史版本,避免阻塞写操作。

通过上述流程,InnoDB在高效处理更新的同时,确保了事务的原子性、一致性和持久性。

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

相关文章:

  • Python格式化:让数据输出更优雅
  • 场景题目记录
  • Java - Mysql数据类型对应
  • JxBrowser 8.8.0 版本发布啦!
  • 小天互连IM系统:即时通讯在远程工作中的应用
  • 系统思考:恶性循环
  • 走线太长导致的下冲(Undershoot)现象及解决
  • matplotlib画图报错
  • 使用 pytdx,`TdxHq_API` 接口下载数据的 AI 编程指引提示词
  • 微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
  • 第二十章 BKP
  • 华为认证入门怎么选?
  • Java-面向对象-类与对象(基础)
  • leetcode题解450:删除BST中的结点!调整二叉树的结构最难!
  • ​​绿色PCB通关密码:猎板无铅焊料+水性油墨的RoHS合规实践​​
  • SpringBoot基于RabbitMQ实现异步请求处理
  • CentOS7下的Flink 集群部署
  • 【LLM】深入解析MCP的三种传输方式实现
  • 《C++ 继承》
  • 2024年12月6级第一套
  • 【HarmonyOS 5.0】开发实战:从UI到Native全解析
  • 鸿蒙多语言开发实战:3 步实现中英文动态切换(无需重启 App)附完整代码 + 避坑指南
  • CentOS7下的集群化部署
  • 电子接口与微控制器核心知识:串口、并口、USB、UART、RS232/RS485、ESP32与STM32详解
  • 零基础学前端-传统前端开发(第二期-HTML介绍与应用)(XSS防御)
  • C# StringBuilder代码中预分配容量的作用
  • 企业中使用 MCP Server 实现业务打通
  • (二)TensorRT-LLM | 模型导出(v0.20.0rc3)
  • 第一讲:认识C++程序
  • 《网络世界的“隐形窥探者”:深度剖析网络监听》