MYSQL-->InnoDB引擎底層原理( 四 )


當update、delete的時候 , 產生的undo log日志不只是回滾時需要 , 在快照讀時也需要,不會被立即刪除 。
Undo log版本鏈
不同事務或相同事務對同一條記錄進行修改,會導致該記錄的undo log生成一個記錄的版本鏈表 , 鏈表的頭部是最新的舊記錄,鏈表的尾部是最早的舊記錄 。

MYSQL-->InnoDB引擎底層原理

文章插圖
執行順序:
從上到下代表執行順序 。在同一行代表同一時間執行 。
ReadView(讀視圖)ReadView(讀視圖)是快照讀SQL執行時MVCC提取數據的依據 , 記錄并維護系統當前活躍的事務(未提交的)id
ReadView中包含了四個核心字段
字段含義m_ids當前活躍的事務id集合min_trx_id最小活躍的事務IDmax_trx_id預分配事務ID,當前最大事務ID+1(因為事務ID是自增的)creator_trx_idReadView創建者的事務ID版本鏈數據訪問規則
trx_id 代表的是當前事務的id
用這個id和ReadView的四個核心字段進行比對
  1. trx_id == creator_trx_id 可以訪問該版本這個條件成立代表數據是當前這個事務更改的
  2. trx_id < min_trx_id           可以訪問該版本          這個條件成立,說明數據已提交
  3. trx_id > max_trx_id          不可以訪問該版本      這個條件成立 , 說明事務是在ReadView生成之后才開啟的
  4. min_trx_id <= trx_id <= max_trx_id    如果trx_id不在m_ids中,就可以訪問該版本
    這個條件成立,說明數據已經提交 。
根據隔離級別的不同ReadView生成時機不同
  1. 在Read Committed隔離級別下
    在事務第一次執行快照讀時都生成一個Read view
  2. 在Repeatable read隔離級別下
    在事務第一次執行快照讀時生成,后續復用這個Read view
在RC隔離級別下,版本鏈訪問原理分析在事務第一次執行快照讀時都生成一個Read view
第一個快照讀,讀取情況
MYSQL--&gt;InnoDB引擎底層原理

文章插圖
這個快照讀,根據規則,讀取的是0x00002這個地址的數據 , 對應著事務2修改后的數據內容 。
第二個快照讀,讀取情況
MYSQL--&gt;InnoDB引擎底層原理

文章插圖
這個快照讀,根據規則讀取到的是,0x00003地址的數據內容,就是事務3修改后的數據 。
在RR隔離級別下,版本鏈訪問原理分析在RR隔離級別下 , 只有事務在第一次執行快照讀的時候生成ReadView , 后續復用這個ReadView
MYSQL--&gt;InnoDB引擎底層原理

文章插圖
具體的和RC規則一致,不重復講解 。
總結隱藏字段+Undo log版本鏈+ReadView組成MVCC
MVCC+鎖構成事務的隔離機制
事務的一致性由Redo log和undo log共同保證

推薦閱讀