《寶可夢朱紫》6星太晶坑吸血流打法攻略
1 什麼是MVCC
MVCC,即多版本併發控制。維持一個數據的多個版本,使得讀寫操作沒有衝突。MVCC是為了解決讀-寫衝突,做到即使有讀-寫衝突時,也能做到不加鎖,非阻塞併發讀。
在併發讀寫資料庫時,可做到在讀操作時不用阻塞寫操作,寫操作也不用阻塞讀操作,提高了資料庫併發讀寫的效能。
通過MVCC使得InnoDB事務隔離級別預設達到可重複讀(通過MVCC可以在不影響效能的情況下實現可重複讀,所以InnoDB才敢把事務隔離級別預設設定為可重複讀)。而oracle預設隔離級別還是讀已提交。
2 MVCC實現原理
2.1 三個隱藏欄位
InnoDB為每行記錄都添加了三個隱藏欄位
-
隱藏ID
- 事務ID(DB_TRX_ID)
- 回滾指標(DB_ROLL_PTR)
2.2 buff pool和redo log和undo log
InnoDB為了減少磁碟IO次數,提供了Buffer Pool(快取),作為訪問資料庫的緩衝。
- a當從資料庫讀取資料時,會首先從Buffer Pool中讀取,如果Buffer Pool中沒有,則從磁碟讀取後放入Buffer Pool。
- b當向資料庫寫入資料時,會首先寫入Buffer Pool,Buffer Pool中修改的資料會定期重新整理到磁碟中(這一過程稱為刷髒)。
Buffer Pool大大提高了讀寫效能,但是帶來了新的問題,如果
因此,redo log被引來解決這個問題,當資料修改時,除了修改Buffer Pool中的資料,還會在redo log記錄這次操作;當事務提交時,會呼叫fsync介面對redo log進行刷盤。
所有修改先寫入redo log,再更新到Buffer Pool,保證了資料不會因宕機而丟失。從而滿足了永續性的要求。
undo log:
undo log用於事務回滾,當事務對資料庫進行修改時,InnoDB會生成對應的undo log。如果事務回滾,則利用undo log將資料回滾到修改之前的樣子
3 MVCC對資料進行更新原理
3.1 初始資料
前6列是資料,後面三個隱藏欄位,剛插入時,事務ID和回滾指標都是NULL
3.2 事務1
事務1對資料進行更改時
- 首先對該行加鎖
- 寫redo log日誌
- 舊資料寫入undo log日誌
- 修改當前行的值,填寫事務ID,使回滾指標指向undo log。
3.3 事務2
與事務1相同,記錄undo log
MVCC中的多版本,就是指的undo log中的多個版本並存的狀態。
當存在事務0,進行的是讀操作1,且進行了比較耗時的過程,在此過程中,上面事務1開始並提交,事務2開始並提交,事務0再進行讀操作2,第二次讀操作讀的是undo log中的對應的記錄,兩次讀操作讀到的是相同的值,實現了可重複讀。在此期間undo log對應的事務ID記錄不能被purge執行緒回收,(purge執行緒會查詢比現在最老的活動事務還早的undo log日誌並刪除它們,保證undo log不至於太大)。