MVCC(Multi-Version Concurrency Control,多版本并發控制)是一種數據庫事務處理機制,用于解決多個事務同時訪問相同數據時產生的問題
在 MySQL 中,MVCC 主要通過以下方式實現:
隱藏字段:InnoDB 存儲引擎為每行數據添加兩個隱藏字段,分別表示該行數據的創建時間(DB_TRX_ID)和過期時間(DB_ROLL_PTR)。這些隱藏字段用于記錄數據的版本信息。
一致性讀:在事務開始時,InnoDB 會為事務分配一個唯一的事務 ID(trx_id)。當事務執行讀操作時,InnoDB 會根據以下規則判斷數據行的可見性:
寫操作:當事務執行寫操作(如 INSERT、UPDATE、DELETE)時,InnoDB 會生成一個新的數據行版本,并將舊版本保存在回滾段(rollback segment)中。同時,更新數據行的 DB_TRX_ID 和 DB_ROLL_PTR 隱藏字段。
事務提交與回滾:當事務提交時,InnoDB 會清除該事務相關的回滾段。當事務回滾時,InnoDB 會利用回滾段中的數據恢復到事務開始時的狀態。
垃圾回收:InnoDB 使用后臺進程定期清理不再需要的舊數據版本。這些舊數據版本可能是由于事務回滾、長時間運行的事務等原因而未被清理的。
通過 MVCC,MySQL 可以在不加鎖的情況下實現高并發訪問,提高系統的性能和可擴展性。然而,MVCC 也有一定的局限性,例如在長時間運行的事務中可能會導致回滾段膨脹,消耗大量存儲空間。因此,在實際應用中需要根據業務場景合理選擇事務隔離級別和并發控制策略。