mysql MVCC隨筆

    MVCC(Multi-Version Concurrency Control ,多版本併發控制)指的就是在使用READ COMMITTD、 REPEATABLE READ這兩種隔離級別的事務在執行普通的SEELCT操作時訪問記錄的版本鏈的過程。這裏必須引入兩個概念:版本鏈和ReadView。

   版本鏈: 對於使用InnoDB存儲引擎的表來說,它的聚簇索引記錄中都包含兩個必要的隱藏列(row_id並不是必要的,我們

創建的表中有主鍵或者非NULL唯一鍵時都不會包含row_id列):

  •     trx_id:每次對某條記錄進行改動時,都會把對應的事務id賦值給trx_id隱藏列。
  • roll_pointer:每次對某條記錄進行改動時,這個隱藏列會存一個指針,可以通過這個指針找到該記

    錄修改前的信息。

    ReadView

  1. m_ids:表示在生成ReadView時當前系統中活躍的讀寫事務的事務id列表。
  2.  min_trx_id:表示在生成ReadView時當前系統中活躍的讀寫事務中最小的事務id,也就是m_ids中的最小 值。
  3. max_trx_id:表示生成ReadView時系統中應該分配給下一個事務的id值。
  4. creator_trx_id:表示生成該ReadView的事務的事務id

     有了這個ReadView,這樣在訪問某條記錄時,只需要按照下邊的步驟判斷記錄的某個版本是否可見:

  1. 如果被訪問版本的trx_id屬性值與ReadView中的creator_trx_id值相同,意味着當前事務在訪問它自 己修改過的記錄,所以該版本可以被當前事務訪問。
  2. 如果被訪問版本的trx_id屬性值小於ReadView中的min_trx_id值,表明生成該版本的事務在當前事 務生成ReadView前已經提交,所以該版本可以被當前事務訪問。
  3. 如果被訪問版本的trx_id屬性值大於ReadView中的max_trx_id值,表明生成該版本的事務在當前事 務生成ReadView後纔開啓,所以該版本不可以被當前事務訪問。
  4. 如果被訪問版本的trx_id屬性值在ReadViewmin_trx_idmax_trx_id之間,那就需要判斷一下 trx_id屬性值是不是在m_ids列表中,如果在,說明創建ReadView時生成該版本的事務還是活躍 的,該版本不可以被訪問;如果不在,說明創建ReadView時生成該版本的事務已經被提交,該版本可以被訪問。

​​​​​​​    讀已提交跟可重複讀的區別就是,讀已提交每次讀取數據都會生成新的ReadView,而可重複讀只在第一次讀取數據時生成一個ReadView。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章