MySQLInnoDBMVCC實現原理
來源:懂視網
責編:小采
時間:2020-11-09 15:15:53
MySQLInnoDBMVCC實現原理
MySQLInnoDBMVCC實現原理:MVCC背景:MySQL事務默認使用REPEATABLE READ(可重復讀)隔離級別。該隔離級別還是會產生幻讀問題。即當某個事務讀取某個范圍的記錄時,另外一個事物在該范圍插入了新的記錄,那么之前的事務再次讀取該范圍的記錄時,會產生幻行。MySQL InnoDB就是
導讀MySQLInnoDBMVCC實現原理:MVCC背景:MySQL事務默認使用REPEATABLE READ(可重復讀)隔離級別。該隔離級別還是會產生幻讀問題。即當某個事務讀取某個范圍的記錄時,另外一個事物在該范圍插入了新的記錄,那么之前的事務再次讀取該范圍的記錄時,會產生幻行。MySQL InnoDB就是

MVCC背景:
MySQL事務默認使用REPEATABLE READ(可重復讀)隔離級別。該隔離級別還是會產生幻讀問題。即當某個事務讀取某個范圍的記錄時,另外一個事物在該范圍插入了新的記錄,那么之前的事務再次讀取該范圍的記錄時,會產生幻行。MySQL InnoDB就是通過多版本并發控制(MVCC)解決幻讀問題。
MVCC簡介:
MVCC將數據庫的行鎖與行的多個版本結合起來,只需要很小的開銷,就可以實現非鎖定讀,從而大大提高數據庫系統的并發性能.
MVCC實現原理:
MVCC保存某個時間點上的數據快照。一個事務內,看到的是同一個版本的快照,數據一致。不同事務在同一時間點看到的數據會不一致,因為他們得到的數據版本不一樣。InnoDB在每行記錄存在額外的隱藏字段,其中一列存儲行被更新的版本號,另外一列存儲行被刪除的版本號。每當一個事務開始的時候,innodb都會給這個事務分配一個遞增的版本號,所以版本號也可以被認為是事務號.對于每一個”查詢”語句,innodb都會把這個查詢語句的版本號同這個查詢語句遇到的行的版本號進行對比,然后結合不同的事務隔離等級,來決定是否返回該行。當隔離級別是REPEATABLE
READ時,這種策略下,select、delete、 insert、 update語句如何操作:
1) SELECT 對于select語句,只有同時滿足了下面兩個條件的行,才能被返回:
?行的被修改版本號小于或者等于該事務號
?行的被刪除版本號要么沒有被定義,要么大于事務的版本號:行的刪除版本號如果沒有被定義,說明該行沒有被刪除過;如果刪除版本號大于當前事務的事務號,說明該行是被該事務后面啟動的事務刪除的,由于是repeatable read隔離等級,后開始的事務對數據的影響不應該被先開始的事務看見,所以該行應該被返回.
2) INSERT 對新插入的行,行的更新版本被修改為該事務的事務號
3) DELETE 對于刪除,innodb直接把該行的被刪除版本號設置為當前的事務號,相當于標記為刪除,而不是實際刪除
4) UPDATE 在更新行的時候,innodb會把原來的行復制一份到回滾段中,并把當前的事務號作為該行的更新版本
InnoDB存儲引擎MVCC的實現策略:
在每一行數據中額外保存兩個隱藏字段:當前行創建時的版本號和刪除時的版本號(可能為空)。每個事務又有自己的版本號,這樣事務內執行CRUD操作時,就通過版本號的比較來達到數據版本控制的目的。具體做法見下面的示意圖。
MVCC缺點:
為了實現多版本,InnoDB需要維護額外的隱藏字段,以及清理不需要的行版本,帶來額外開銷。
更多相關教程請訪問 MySQL視頻教程
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com
MySQLInnoDBMVCC實現原理
MySQLInnoDBMVCC實現原理:MVCC背景:MySQL事務默認使用REPEATABLE READ(可重復讀)隔離級別。該隔離級別還是會產生幻讀問題。即當某個事務讀取某個范圍的記錄時,另外一個事物在該范圍插入了新的記錄,那么之前的事務再次讀取該范圍的記錄時,會產生幻行。MySQL InnoDB就是