1. 程式人生 > 遊戲攻略 >《寶可夢朱紫》6星太晶坑吸血流打法攻略

《寶可夢朱紫》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 poolredo logundo log

InnoDB為了減少磁碟IO次數,提供了Buffer Pool(快取),作為訪問資料庫的緩衝。

  • a當從資料庫讀取資料時,會首先從Buffer Pool中讀取,如果Buffer Pool中沒有,則從磁碟讀取後放入Buffer Pool
  • b當向資料庫寫入資料時,會首先寫入Buffer PoolBuffer Pool中修改的資料會定期重新整理到磁碟中(這一過程稱為刷髒)

Buffer Pool大大提高了讀寫效能,但是帶來了新的問題,如果

mysql宕機,資料有丟失的風險,永續性無法保證。

因此,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不至於太大)