現象: 事務中 INSERT 後 ROLLBACK,自增 ID 不會減少,下次插入繼續遞增。
根因:
INSERT 遞增,不隨 DELETE/ROLLBACK 減少SELECT MAX(id) FROM table FOR UPDATE 獲取最大值初始化計數器結論: 自增 ID 設計為**單調遞增、不重用**,保證唯一性與主從同步一致性,非 Bug 而是特性**。
COMMIT 時先寫 redo log (WAL 機制),再刷盤undo segment 中ROLLBACK 時執行邏輯反操作,**非物理頁恢復**master thread 定期清理 (Purge)| 維度 | Redo Log | Undo Log |
|---|---|---|
| 操作類型 | 物理 (Physical) | 邏輯 (Logical) |
| 記錄內容 | 數據頁具體修改 | SQL 反向操作 |
| 用途 | 崩潰恢復、持久化 | 事務回滾、MVCC 多版本並發控制 |
| 空間管理 | 循環寫入、固定大小 | 動態增長、需 Purge 線程回收 |
| 順序性 | 順序寫入、高效 | 隨機讀寫、相對較慢 |
History list length (Undo 積壓量),過大說明 Purge 跟不上CREATE TABLE t_auto (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20)) ENGINE=InnoDB;
START TRANSACTION;
INSERT INTO t_auto (name) VALUES ('A'); -- id=1
INSERT INTO t_auto (name) VALUES ('B'); -- id=2
ROLLBACK;
INSERT INTO t_auto (name) VALUES ('C'); -- id=3 (非 1)
SELECT * FROM t_auto; -- 僅顯示 id=3