首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

MySQL 事務回滾:DELETE 後數據在緩存/Undo Log 中,ROLLBACK 恢復

     編輯:程式設計疑難解答

現象

`START TRANSACTION` → `DELETE FROM t` → `SELECT * FROM t` 為空 → `ROLLBACK` → 數據恢復。疑問:中間數據存在哪?

答案

**存在於 InnoDB Undo Log(撤銷日志)中**,屬於**事務私有緩存**,不可被其他事務見到(隔離性)。

機制

  1. `DELETE` 標記記錄為「刪除」,寫入 Undo Log 保存**刪除前的完整行映像**。
  2. 當前事務 `SELECT` 讀取到**最新版本**(已刪除標記),故為空。
  3. 其他事務(`READ COMMITTED`/`REPEATABLE READ`)讀取到**舊版本**(通過 Undo Log 回溯),數據仍在。
  4. `ROLLBACK`:遍歷 Undo Log,將頁面恢復到事務開始前狀態,**釋放鎖、釋放 Undo Log 空間**。
  5. `COMMIT`:標記 Undo Log 可清理(由 Purge 線程異步回收)。

關鍵點

  • **未提交的修改對其他事務不可見**(隔離級別決定細節)。
  • Undo Log 存放在 **系統表空間**(`ibdata1`)或**獨立 Undo 表空間**(MySQL 5.6+)。
  • 大事務產生大量 Undo Log,可能導致 `ibdata1` 膨脹、回滾耗時極長。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved