? 什么是 MVCC?它是怎么實現的?(適合基礎不牢固者)
一、MVCC 是什么?
MVCC 全稱是:Multi-Version Concurrency Control,中文叫:多版本并發控制。
主要用于解決數據庫的讀寫并發沖突問題,它的作用是讓讀操作無需加鎖,也能讀到符合事務隔離要求的數據版本。
你可以理解成:
??「數據庫里的一行數據,可能同時有多個版本,讀操作可以看到一個舊版本,寫操作操作一個新版本,從而實現讀寫不沖突。」
二、為什么要有 MVCC?
我們先想一個問題:
多個線程同時讀寫數據,如果每次都加鎖,會不會很慢?
是的!所以:
-
? 為了讓“讀”不加鎖、快速返回
-
? 為了讓“寫”不影響“讀”
?? 引入了 MVCC 技術!
三、MVCC 是如何實現的?(以 MySQL InnoDB 為例)
InnoDB 使用 MVCC 實現了“事務隔離”中的:讀已提交(Read Committed)和可重復讀(Repeatable Read)。
實現的關鍵:隱藏字段 + undo log + 事務ID
?? 每行記錄背后都有兩個隱藏的版本號字段:
字段名 | 說明 |
---|---|
trx_id | 當前修改這行記錄的事務ID(記錄這個版本是誰改的) |
roll_pointer | 指向 undo log(回滾日志)的指針,可以找到舊版本的值 |
?? 舉個真實場景:
假設數據庫里有這樣一行記錄:
id = 1, name = "Alice", trx_id = 100