現象
`START TRANSACTION` → `DELETE FROM t` → `SELECT * FROM t` 為空 → `ROLLBACK` → 數據恢復。疑問:中間數據存在哪?
答案
**存在於 InnoDB Undo Log(撤銷日志)中**,屬於**事務私有緩存**,不可被其他事務見到(隔離性)。
機制
- `DELETE` 標記記錄為「刪除」,寫入 Undo Log 保存**刪除前的完整行映像**。
- 當前事務 `SELECT` 讀取到**最新版本**(已刪除標記),故為空。
- 其他事務(`READ COMMITTED`/`REPEATABLE READ`)讀取到**舊版本**(通過 Undo Log 回溯),數據仍在。
- `ROLLBACK`:遍歷 Undo Log,將頁面恢復到事務開始前狀態,**釋放鎖、釋放 Undo Log 空間**。
- `COMMIT`:標記 Undo Log 可清理(由 Purge 線程異步回收)。
關鍵點
- **未提交的修改對其他事務不可見**(隔離級別決定細節)。
- Undo Log 存放在 **系統表空間**(`ibdata1`)或**獨立 Undo 表空間**(MySQL 5.6+)。
- 大事務產生大量 Undo Log,可能導致 `ibdata1` 膨脹、回滾耗時極長。