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在高效处理更新的同时,确保了事务的原子性、一致性和持久性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

javachen__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值