Read View詳解


前置知識

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去查詢初始的數據行結果,來保證數據相同)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM