前置知識
MVCC
多版本並發控制(Multi-Version Concurrency Control)是MySQL的InnoDB引擎實現隔離級別的一種具體方式。用於實現提交讀和可重復讀。
術語
TRX_ID:Transaction ID 是指事物開始的時候被分配的版本號(即屬於當前事務自己獨有的身份證)。
ROLL_PTR:Roll Pointer 用於將一個數據行的版本快照連接起來的指針(例如,TRX_ID為1時屬性id=1,然后TRX_ID=5時更新id=5,此時的ROLL_PTR指向TRX_ID=1),用於回滾操作。
ReadView
MVCC 中維護了一個 ReadView 結構,主要包含了當前系統未提交的事務列表 TRX_IDs {TRX_ID_1, TRX_ID_2, ...},還有該列表的最小值 TRX_ID_MIN 和 最大值TRX_ID_MAX。
在進行 SELECT 操作時,根據數據行快照的 TRX_ID 與 TRX_ID_MIN 和 TRX_ID_MAX 之間的關系,從而判斷數據行快照是否可以使用:
-
TRX_ID < TRX_ID_MIN,表示該數據行快照時在當前所有未提交事務之前進行更改的,因此可以使用。
-
TRX_ID > TRX_ID_MAX,表示該數據行快照是在事務啟動之后被更改的,因此不可使用。
-
TRX_ID_MIN <= TRX_ID <= TRX_ID_MAX,需要根據隔離級別再進行判斷:
-
提交讀:如果要讀取的數據還存在於TRX_ID事務列表中,表示該數據行快照對應的事務還未提交,則該快照不可使用。否則表示已經提交,可以使用。
-
可重復讀:都不可以使用。因為如果可以使用的話,那么其它事務也可以讀到這個數據行快照並進行修改,那么當前事務再去讀這個數據行得到的值就會發生改變,也就是出現了不可重復讀問題。
可重復讀隔離級別則在第一次讀的時候會生成一個ReadView,之后的讀都復用之前的ReadView。(會通過ROLL_PTR去查詢初始的數據行結果,來保證數據相同)