借助OpenClaw能自动生成标书吗?TaoToken统一Key打通RPA与爬虫链路
2026/10/9 12:54:15
以
UPDATE test SET a=1 WHERE id=2为例,完整讲解执行流程。
在开始之前,你需要记住三个日志文件的作用:
事务开始时,MySQL会先记录undo log。
操作:UPDATE test SET a=1 WHERE id=2 undo log记录: ┌─────────────────────┐ │ 操作类型:UPDATE │ │ 表名:test │ │ id = 2的旧值:a=0 │(假设原来a的值是0) └─────────────────────┘如果你执行了UPDATE,然后想回滚(ROLLBACK),MySQL就用undo log里的旧值把数据改回去。
BEGIN; UPDATE test SET a=1 WHERE id=2; -- undo log记录 a原来是0 ROLLBACK; -- 用undo log把a改回0undo log记录完后,存储引擎(InnoDB)会写入redo log,并标记状态为prepare。
redo log内容: ┌──────────────────────────────────┐ │ 操作类型:UPDATE │ │ id=2, a=1(新值) │ │ 状态:prepare(准备中) │ └──────────────────────────────────┘ ↓ (立即刷入磁盘) 磁盘中的redo log file这一步的意义:
prepare,说明还没有最终提交写完redo log后,MySQL获取行锁,在内存中修改数据。
步骤流程: 1. 获取id=2这一行的行锁 ↓ 2. 从磁盘读入内存(buffer pool) - 读到:id=2, a=0(旧值) ↓ 3. 在内存中修改 - 改为:id=2, a=1(新值) ↓ 4. 标记为脏页(dirty page) - 说明这个数据页的内存版本和磁盘版本不一致注意:此时数据还在内存中,没有写入磁盘!
这是InnoDB的优化策略:
binlog是MySQL服务层维护的日志,不是存储引擎的。
在事务提交前,MySQL会将操作写入binlog。
binlog内容: ┌──────────────────────────────────┐ │ UPDATE test SET a=1 WHERE id=2 │ │ 时间戳:2025-01-07 10:30:00 │ │ 连接ID:12345 │ └──────────────────────────────────┘ binlog主要用途: 1. 主从复制:从库读主库的binlog来同步数据 2. 数据恢复:结合备份文件,恢复到某个时间点这是关键的一步!包含两个操作:
redo log状态变化: prepare → commit redo log: ┌──────────────────────────────────┐ │ 操作类型:UPDATE │ │ id=2, a=1 │ │ 状态:commit(已提交) │ └──────────────────────────────────┘ 立即刷入磁盘操作完成,释放id=2这一行的锁 其他事务现在可以修改id=2的数据了这是确保redo log和binlog一致性的机制,也是为什么MySQL的可靠性这么高的原因。
第一阶段(Prepare): ↓ redo log写入磁盘,状态=prepare ↓ 不能立即提交,要等binlog写完 第二阶段(Commit): ↓ binlog写入磁盘 ↓ redo log状态改为commit,写入磁盘 ↓ 事务最终完成假设没有两阶段提交:
场景1:只写redo log不写binlog
UPDATE执行了 → 主库数据改了 → 从库没收到 →主从数据不一致!
场景2:只写binlog不写redo log
UPDATE执行了 → binlog记录了 →系统崩溃 → 无法恢复数据!
两阶段提交保证:
假设:redo log已经写入(prepare),binlog已经写入, 但redo log的commit状态还没写入磁盘就崩溃了 MySQL重启后: 1. 扫描redo log 2. 看到这个操作状态是prepare 3. 查看binlog中是否有对应的操作记录 4. 如果binlog中有,说明操作已经完成,就把redo log改为commit 5. 如果binlog中没有,说明操作没完成,就回滚这个操作UPDATE test SET a=1 WHERE id=2 执行过程: 时间点1:事务开始 → 记录undo log(id=2, a原来的值) 时间点2:执行阶段 → 写redo log(prepare状态) → 获取行锁 → 在buffer pool中修改数据为a=1 → 标记为脏页 时间点3:提交阶段开始 → 写binlog(用于主从复制) 时间点4:提交阶段完成 → 修改redo log状态为commit → 释放行锁 → 事务完成! 时间点5:后台线程(不一定立即) → 将脏页刷入磁盘 → 如果故障恢复需要,redo log可以帮忙恢复