一篇了解全MVCC

一、什么是MVCCMVCC,全稱Multi-Version Concurrency Control , 即多版本并發控制 , 是一種并發控制的方法,一般用在數據庫管理系統中 , 實現對數據庫的并發訪問,比如在MySQL InnoDB中主要是為了提高數據庫并發性能,不用加鎖,非阻塞并發讀 。MVCC多版本并發控制指的是維持一個數據的多個版本,使得讀寫操作沒有沖突 , 快照讀是MySQL為實現MVCC的一個非阻塞讀功能 。
二、解決的問題是什么?1、三種數據庫并發場景:

  • 讀讀:不會有問題,也不需要并發控制
  • ?讀寫:有線程安全問題 , 可能會造成事務隔離性問題,可能遇到臟讀、幻讀、不可重復讀
  • ?寫寫:有線程安全問題,可能存在更新丟失問題
2、解決問題?MVCC是一種用來解決讀寫沖突的無鎖并發控制,也就是為事務分配單項增長的時間戳,為每個修改保存一個版本,版本與事務時間戳關聯,讀操作只讀該事務開始前的數據庫的快照(隔離級別RC下),所以MVCC為數據庫解決了以下問題:
  • 在并發讀寫數據庫時 , 可以做到在讀操作時不用阻塞寫操作,寫操作也不用阻塞讀操作,提高了數據庫并發讀寫的性能
  • 解決臟讀、幻讀、不可重復讀等事務隔離問題,但是不能解決更新丟失問題
三、實現原理主要依賴于記錄中的三個隱藏字段、undolog , read view來實現的 。
1、隱藏字段每行記錄,除了我們自定義的字段外,還有數據庫隱式定義的DB_TRX_ID,DB_ROLL_PTR,DB_ROW_ID等字段:
  • DB_ROW_ID:6字節,隱藏的主鍵,如果數據表沒有主鍵,那么innodb會自動生成一個6字節的row_id
  • ?DB_TRX_ID:6字節,最近修改事務id,記錄創建這條記錄或者最后一次修改該記錄的事務id
  • DB_ROLL_PTR:7字節 , 回滾指針,用于配合undo日志,指向上一個舊版本
假設記錄如圖所示:
一篇了解全MVCC

文章插圖
2、undolog1)概念回滾日志,表示在進行insert , delete,update操作的時候產生的方便回滾的日志 。
2)說明
  • 當進行insert操作的時候,產生的undolog,只在事務回滾的時候需要用到,并且在事務提交之后可以被立刻丟棄
  • 當進行update和delete操作的時候,產生的undolog,不僅僅在事務回滾的時候需要,在快照讀的時候也需要,所以不能隨便刪除 , 只有在快照讀或事務回滾不涉及該日志時,對應的日志才會被purge線程統一清除
當數據發生更新和刪除操作的時候,實際只是設置了舊記錄的deleted_bit,并不是將過時的記錄刪除 , 因為為了節省磁盤空間,innodb有專門的purge線程來清除deleted_bit為true的記錄,如果某個記錄的deleted_id為true,并且DB_TRX_ID相對于purge線程的read view 可見,那么這條記錄就是可以被清除的
3)undolog生成的記錄鏈表(1)假設有一個事務編號為1的事務向表中插入一條記錄 , 那么此時行數據如下,主鍵id=1,事務id=1
一篇了解全MVCC

文章插圖
(2)假設有第二個事務(編號為2)對該記錄的name做出修改 , 改為lisi底層操作:在事務2修改該行記錄數據時1、對該數據行加排他鎖2、把該行數據拷貝到undolog中,作為舊記錄3、修改該行name為lisi,并且修改事務id=2,回滾指針指向拷貝到undolog的副本記錄中4、提交事務 , 釋放鎖
一篇了解全MVCC

文章插圖
(3)假設有第三個事務(編號為3)對該記錄的age做了修改,改為32底層操作:在事務3修改該行記錄數據時1、對該數據行加排他鎖2、把該行數據拷貝到undolog中,作為舊記錄,發現該行記錄已經有undolog了 , 那么最新的舊數據作為鏈表的表頭,插在該行記錄的undolog最前面3、修改該行age為32歲,并且修改事務id=3,回滾指針指向剛剛拷貝的undolog的副本記錄4、提交事務,釋放鎖
一篇了解全MVCC

文章插圖
從上述的一系列圖中 , 可以發現,不同事務或者相同事務的對同一記錄的修改,會導致該記錄的undolog生成一條記錄版本鏈表,undolog的表頭就是最新的舊記錄,表尾就是最早的舊記錄 。
3、read viewRead View是事務進行快照讀操作的時候生產的讀視圖 , 在該事務執行快照讀的那一刻,系統會生成一個此刻的快照,記錄并維護系統此刻活躍事務的id,用來做可見性判斷的 , 也就是說當某個事務在執行快照讀的時候,對該記錄創建一個Read View的視圖,把它當作條件去判斷當前事務能夠看到哪個版本的數據,有可能讀取到的是最新的數據,也有可能讀取到的是當前行記錄的undolog中某個版本的數據

推薦閱讀