資料庫實作事務隔離的方式
- 一種是在讀取資料前,對其加鎖,阻止其他事務對資料進行修改。
- 另一種是不用加任何鎖,通過一定機制生成一個資料請求時間點的一緻性資料快照(Snapshot),并用這個快照來提供一定級别(語句級或事務級)的一緻性讀取。從使用者的角度來看,好像是資料庫可以提供同一資料的多個版本,是以,這種技術叫做資料多版本并發控制(MultiVersion Concurrency Control,簡稱MVCC或MCC),也經常稱為多版本資料庫。
InnoDB MVCC
InnoDB中的MVC是通過增加兩個隐藏列來實作的。一列存儲行的建立時間或修改時間,一列存儲行的删除時間。時間是通過版本号(SVN)來确定的。
RepeatTable Read級别下MVCC實作
- Select
- 目前行建立列的版本号小于或等于目前事務的SVN,如果小于說明事務開始前該行已經存在,等于則說明該行被目前事務修改過
- 目前航删除列的SVN為空或大于目前事務的SVN,如果為空說明該行未被删除,大于則說明該行是在事務開始之後被删除的
- INSERT
- 修改建立列的SVN為目前事務的SVN
- DELETE
- 修改删除列的SVN為目前事務的SVN
- UPDATE
- 複制新行的建立列的SVN為目前事務的SVN,删除列的SVN為空
- 舊行的删除列為目前事務的SVN,建立列的SVN不變
MVCC相關的三個字段
- DB_TRX_ID
6BYTE,每處理一個事務,其值+1,即建立列的版本号。用1個bit辨別删除操作。
- DB_ROLL_PTR
7byte,指向寫到rollback segment(復原段)的一條undo log記錄(update操作的話,記錄update前的ROW值)
- DB_ROW_ID
6byte,該值随新行插入單調增加,當由innodb自動産生聚集索引時,聚集索引包括這個DB_ROW_ID的值,否則聚集索引中不包括這個值