MVCC(多版本并發(fā)控制)底層原理

MVCC(多版本并發(fā)控制)底層原理總結:

MVCC 是通過維護數據的多個版本來控制并發(fā)訪問的技術扼雏,它使得數據庫能夠支持高并發(fā)事務岂傲,同時保證事務之間的隔離性和一致性扫沼。在 MySQL 的 InnoDB 存儲引擎中叁温,MVCC 是通過 隱藏列ReadView 快照undo log 來實現的学辱。

1. 關鍵概念:

  • 隱藏列(Hidden Columns):為了支持 MVCC 機制乘瓤,InnoDB 在每一行數據中隱藏了兩個額外的列,分別是 DB_TRX_IDDB_ROLL_PTR策泣。這兩個列并不直接暴露給用戶衙傀,但它們對 MVCC 的工作至關重要。DB_TRX_ID 存儲了最近修改該行數據的事務 ID萨咕,而 DB_ROLL_PTR 存儲了指向該行數據歷史版本的指針统抬。
  • ReadView 快照:為了支持事務隔離級別(如“讀已提交”或“可重復讀”),InnoDB 會在每個查詢操作時創(chuàng)建一個 ReadView 快照危队。該快照存儲了當前查詢事務的 ID聪建、所有未提交事務的事務 ID(按升序排列)以及未開始的事務 ID。通過這些信息茫陆,數據庫可以判斷查詢事務能看到哪些數據版本金麸。
  • Undo Log(回滾日志):記錄事務對數據的修改操作。當事務修改數據時簿盅,InnoDB 會為該數據生成一個新的版本挥下,舊版本數據會保存在 undo log 中。

2. ReadView 快照內容:

  • 當前查詢事務 ID:表示當前正在執(zhí)行查詢的事務 ID桨醋。
  • 未提交事務的事務 ID(按升序排列):記錄了當前未提交事務的事務 ID棚瘟,從最小到最大排序。
  • 未開始的事務 ID:記錄那些尚未開始的事務 ID喜最。

3. Undo Log 數據讀取邏輯:

當執(zhí)行查詢操作時解取,InnoDB 會根據當前事務的 ReadView 快照信息來判斷能讀取到哪些數據版本。這一過程通過以下幾個步驟實現:

  • 當前查詢事務 ID = Undo Log 里的事務 ID:如果數據的事務 ID 與當前查詢事務的 ID 匹配返顺,說明該數據是當前事務修改的,當前事務可讀取該數據蔓肯。

  • Undo Log 事務 ID < 未提交事務的最小事務 ID:如果 Undo Log 中的事務 ID 小于未提交事務的最小事務 ID遂鹊,說明該數據是在當前查詢事務開始之前就已經提交的,因此該數據可被讀取蔗包。

  • Undo Log 事務 ID > 未開始事務的最大事務 ID:如果 Undo Log 中的事務 ID 大于未開始事務的最大事務 ID秉扑,說明該數據是在查詢事務開始之后的并發(fā)事務中進行修改的,當前事務不能讀取此數據。此時舟陆,需要根據 Undo Log 的指針查找下一條數據误澳。

  • Undo Log 事務 ID 在未提交事務的最小事務 ID 和最大事務 ID 之間:如果 Undo Log 中的事務 ID 位于未提交事務的最小和最大事務 ID 之間,說明該數據是在并發(fā)的未提交事務中修改的秦躯,當前查詢事務不能讀取此數據忆谓。此時,查詢會再次進行上述判斷踱承,直到找到符合可讀條件的數據倡缠。

4. 讀已提交隔離級別的處理:

  • 讀已提交 隔離級別下,每次查詢的時候都會創(chuàng)建 ReadView 快照茎活,根據這個快照去 Undo Log 里邊找到數據昙沦,查找到符合條件的最新版本數據。
  • 在執(zhí)行查詢時载荔,如果數據修改是未提交事務所做的盾饮,查詢將跳過該數據,直到找到符合條件的數據懒熙。

5. 可重復讀隔離級別的處理:

  • 可重復讀 隔離級別下丘损,創(chuàng)建 ReadView 快照只會在第一次讀取時進行,后續(xù)的查詢會使用相同的 ReadView 快照煌珊。因為可重復讀第一次讀的數據和之后讀的數據一致号俐,所以只需在第一次讀的時候創(chuàng)建快照。
  • 由于同一個快照被多次復用定庵,事務中的讀取操作可以獲得一致的數據版本吏饿,避免了“不可重復讀”的問題。

6. 隱藏列的作用:

  • DB_TRX_ID:每一行數據中都會有一個 DB_TRX_ID 列蔬浙,它記錄了最后修改該行數據的事務 ID猪落。當查詢需要檢查某行數據時,InnoDB 會根據 DB_TRX_ID 來判斷該行數據是否是當前事務能夠讀取的畴博。如果該行的事務 ID 比當前查詢事務的事務 ID 早(即該數據在查詢開始時已提交)笨忌,則該數據對查詢事務可見。

  • DB_ROLL_PTR:該列指向了該行數據歷史版本的 Undo Log 指針俱病。如果查詢的數據版本不可見官疲,InnoDB 會根據 DB_ROLL_PTR 查找該數據的歷史版本,繼續(xù)查找直到找到一個符合條件的可見數據版本亮隙。

7. 總結:

  • MVCC通過 隱藏列途凫、ReadView 快照Undo Log 來實現數據的并發(fā)控制,保證高并發(fā)環(huán)境下的數據一致性和事務隔離性溢吻。
  • 讀已提交和可重復讀的隔離級別分別通過每次查詢創(chuàng)建 ReadView 快照(讀已提交)或僅在首次讀取時創(chuàng)建快照(可重復讀)來控制數據的可見性维费。
  • 通過比較 Undo Log 中的事務 ID 與當前 ReadView 快照中的信息,InnoDB 判斷一個數據版本是否可見,從而保證數據的隔離性犀盟。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末而晒,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子阅畴,更是在濱河造成了極大的恐慌倡怎,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恶阴,死亡現場離奇詭異诈胜,居然都是意外死亡,警方通過查閱死者的電腦和手機冯事,發(fā)現死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門焦匈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人昵仅,你說我怎么就攤上這事缓熟。” “怎么了摔笤?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵够滑,是天一觀的道長。 經常有香客問我吕世,道長彰触,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任命辖,我火速辦了婚禮况毅,結果婚禮上,老公的妹妹穿的比我還像新娘尔艇。我一直安慰自己尔许,他們只是感情好,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布终娃。 她就那樣靜靜地躺著味廊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪棠耕。 梳的紋絲不亂的頭發(fā)上余佛,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音窍荧,去河邊找鬼辉巡。 笑死,一個胖子當著我的面吹牛搅荞,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼咕痛,長吁一口氣:“原來是場噩夢啊……” “哼痢甘!你這毒婦竟也來了?” 一聲冷哼從身側響起茉贡,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤塞栅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后腔丧,有當地人在樹林里發(fā)現了一具尸體放椰,經...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年愉粤,在試婚紗的時候發(fā)現自己被綠了砾医。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡衣厘,死狀恐怖如蚜,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情影暴,我是刑警寧澤错邦,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站型宙,受9級特大地震影響撬呢,放射性物質發(fā)生泄漏。R本人自食惡果不足惜妆兑,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一魂拦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧箭跳,春花似錦晨另、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至屉来,卻和暖如春路翻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背茄靠。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工茂契, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人慨绳。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓掉冶,卻偏偏與公主長得像真竖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子厌小,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355