START TRANSACTION;
DELETE FROM t WHERE id = 1;
SELECT * FROM t; -- 看不到資料
ROLLBACK;
SELECT * FROM t; -- 資料又出現了
DELETE 時,不會立即從資料頁移除記錄,而是:
SELECT 依隔離級別(預設 REPEATABLE READ)讀取事務開始時的快照,或當前事務的修改,因此看不到被標記刪除的列。資料從未離開資料頁,只是被打上「刪除標記」並記錄舊版本於 Undo Log。緩衝池 中的資料頁已修改(髒頁),但未刷盤;Undo Log 同樣在緩衝池,定期由後台執行緒刷盤。
innodb_undo_log_truncate、innodb_undo_tablespaces:控制 Undo 表空間獨立與截斷。SHOW ENGINE INNODB STATUS 中 History list length 反映未清理的 Undo 量。DELETE 到 ROLLBACK 期間,資料以「刪除標記 + Undo Log 舊版本」形式存在於記憶體緩衝池(並持久化至 Undo 表空間),並非另存一份完整副本。這正是事務原子性與隔離性的基石。