天天看點

InnoDB中MVCC的實作

資料庫實作事務隔離的方式

  1. 一種是在讀取資料前,對其加鎖,阻止其他事務對資料進行修改。
  2. 另一種是不用加任何鎖,通過一定機制生成一個資料請求時間點的一緻性資料快照(Snapshot),并用這個快照來提供一定級别(語句級或事務級)的一緻性讀取。從使用者的角度來看,好像是資料庫可以提供同一資料的多個版本,是以,這種技術叫做資料多版本并發控制(MultiVersion Concurrency Control,簡稱MVCC或MCC),也經常稱為多版本資料庫。

InnoDB MVCC

InnoDB中的MVC是通過增加兩個隐藏列來實作的。一列存儲行的建立時間或修改時間,一列存儲行的删除時間。時間是通過版本号(SVN)來确定的。

RepeatTable Read級别下MVCC實作

  • Select
    1. 目前行建立列的版本号小于或等于目前事務的SVN,如果小于說明事務開始前該行已經存在,等于則說明該行被目前事務修改過
    2. 目前航删除列的SVN為空或大于目前事務的SVN,如果為空說明該行未被删除,大于則說明該行是在事務開始之後被删除的
  • INSERT
    1. 修改建立列的SVN為目前事務的SVN
  • DELETE
    1. 修改删除列的SVN為目前事務的SVN
  • UPDATE
    1. 複制新行的建立列的SVN為目前事務的SVN,删除列的SVN為空
    2. 舊行的删除列為目前事務的SVN,建立列的SVN不變

MVCC相關的三個字段

  1. DB_TRX_ID
    6BYTE,每處理一個事務,其值+1,即建立列的版本号。用1個bit辨別删除操作。
  2. DB_ROLL_PTR
    7byte,指向寫到rollback segment(復原段)的一條undo log記錄(update操作的話,記錄update前的ROW值)
  3. DB_ROW_ID
    6byte,該值随新行插入單調增加,當由innodb自動産生聚集索引時,聚集索引包括這個DB_ROW_ID的值,否則聚集索引中不包括這個值