undo log 是什么?他的记录原理是什么?
1 个回答
风中传来苦咸,是科学的甜美气息!柳清风### **1. `UNDO LOG` 是什么?** `UNDO LOG`(回滚日志)是 **MySQL InnoDB 存储引擎** 用于 **事务回滚** 和 **MVCC(多版本并发控制)** 的日志。它记录数据的 **修改前的旧值(Before Image)**,确保事务回滚时可以恢复原始数据。 ### **2. `UNDO LOG` 的记录原理** #### **(1)记录的内容** | 操作 | `UNDO LOG` 存储内容 | 回滚时执行的操作 | |--------|------------------|----------------| | `INSERT` | 记录 `DELETE` 语句 | `DELETE FROM table WHERE id=?;` | | `DELETE` | 记录被删除的整行数据 | `INSERT INTO table VALUES (...);` | | `UPDATE` | 记录修改前的旧值 | `UPDATE table SET col=? WHERE id=?;` | | `SELECT` | 不记录 `UNDO LOG` | 无需回滚 | #### **(2)记录方式** - **事务执行前**,先将修改前的数据(旧值)写入 `UNDO LOG`。 - **事务回滚时**,读取 `UNDO LOG`,执行反向 SQL 操作恢复数据。 - **事务提交后**,`UNDO LOG` 可能仍被 MVCC 读取,等所有事务都不再访问旧版本后,由后台线程清理。 ### **3. `UNDO LOG` 在 MVCC 中的作用** - `UNDO LOG` 让未提交的事务不会影响其他事务,支持**快照读**(旧事务可以看到修改前的数据)。 - 在 `SELECT` 查询时,**如果数据被修改**,但事务未提交,查询仍可通过 `UNDO LOG` 读取旧版本数据,保证一致性。 ### **4. 总结** 1. **`UNDO LOG` 记录数据修改前的旧值,保证事务回滚可以恢复原始数据。** 2. **记录的内容取决于 SQL 类型,`INSERT` 记录 `DELETE`,`DELETE` 记录 `INSERT`,`UPDATE` 记录旧值。** 3. **回滚时执行 `UNDO LOG` 里的反向 SQL,恢复数据状态。** 4. **`UNDO LOG` 还用于 MVCC,支持快照读,保证数据一致性。**发布于 2025-03-06 03:27 •IP属地 天津举报评论收藏
公众号进入网站体验更佳

