MySQL中MVCC機(jī)制的實(shí)現(xiàn)原理
前言
MVCC全稱為Multi Version Concurrency Control,直譯為多版本并發(fā)控制,是MySQL中一種并發(fā)控制的方法,他主要是為了提高數(shù)據(jù)庫(kù)的讀寫性能,用更好的方式去處理讀寫沖突。
什么是當(dāng)前讀和快照讀?
在講述MVCC機(jī)制實(shí)現(xiàn)原理之前,我們先了解一下當(dāng)前讀和快照讀
當(dāng)前讀:
其實(shí)也很容易理解,當(dāng)前讀指的就是讀取的是最新的記錄,讀取的時(shí)候還需要保證其他事務(wù)不能修改當(dāng)前記錄,所以會(huì)對(duì)讀取的記錄進(jìn)行加鎖處理
例如:select for update 、update、insert、delete這些操作都是當(dāng)前讀
快照讀:
而快照讀也就是不加鎖的select,不過需要注意的是快照讀的前提是隔離級(jí)別不能是serializable(可串行化),之所以出現(xiàn)快照讀,是基于提高并發(fā)性能的考慮
其實(shí)可以簡(jiǎn)單理解成MVCC就是為了實(shí)現(xiàn)讀寫沖突的時(shí)候不去加鎖
MVCC的實(shí)現(xiàn)原理
其實(shí)在MySQL中每一條記錄都會(huì)有一些隱藏字段,而在MVCC機(jī)制中,用處最大的就是trx_id,roll_pointer分別代表著操作這條記錄的事務(wù)的事務(wù)ID,和回滾指針(指向當(dāng)前記錄行的undo log信息),倘若這條記錄沒有主鍵,還包含一個(gè)隱含的主鍵ID
在每一個(gè)事務(wù)開啟之前,都會(huì)先從數(shù)據(jù)庫(kù)中拿到一個(gè)自增的事務(wù)ID
對(duì)于undo log很明顯這就是一個(gè)日志文件,記錄著insert、update、delete,我們?cè)谶M(jìn)行刪除的時(shí)候,其實(shí)innodb引擎并沒有真正的刪除,其實(shí)是將一個(gè)記錄的一個(gè)隱含字段修改了,讓我們?nèi)ニ阉鞯臅r(shí)候搜索不到,所以我們可以知道在undo log中只存在兩種日志,一種是insert undo log,一種是update undo log
undo log的作用就是為了保存版本鏈,而前面我們說的roll_pointer這個(gè)字段就是指向的這里
為了保證可見性,當(dāng)事務(wù)發(fā)起快照讀的時(shí)候,就會(huì)產(chǎn)生一個(gè)Read View(讀視圖),Read View 保存了當(dāng)前事務(wù)開啟時(shí)所有活躍的事務(wù)列表,或者可以理解為保存了其他事務(wù)的ID列表
Read View有幾個(gè)重要屬性:
- trx_ids:當(dāng)前系統(tǒng)中活躍的事務(wù)ID
- low_limit_id:目前出現(xiàn)的最大的事務(wù)ID+1,也就是下一個(gè)將被分配的事務(wù)ID
- up_limit_id:活躍事務(wù)列表中最小的id
- creator_trx_id:當(dāng)前事務(wù)的ID
而對(duì)于Read View的可見性規(guī)則:
- 如果訪問版本事務(wù)id = creator_trx_id 那么證明該事務(wù)操作的就是自己修改過的記錄
- 如果訪問版本事務(wù)id < up_limit_id 那么證明生成該版本的事務(wù)已經(jīng)提交
- 如果訪問版本事務(wù)id > low_limit_id,那么表示生成該版本的事務(wù)還沒有提交不能被訪問
- 如果訪問版本事務(wù)id > up_limit_id 且 id < low_limit_id,那么判斷該事務(wù)id是否在活躍列表中,如果在證明還未提交不能被訪問,反之亦然

到此這篇關(guān)于MySQL中MVCC機(jī)制的實(shí)現(xiàn)原理的文章就介紹到這了,更多相關(guān)MySQL MVCC機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mysql中的超時(shí)時(shí)間設(shè)置方式
這篇文章主要介紹了Mysql中的超時(shí)時(shí)間設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
深入理解MySQL的數(shù)據(jù)庫(kù)引擎的類型
本篇文章是對(duì)MySQL的數(shù)據(jù)庫(kù)引擎的類型進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
MySQL日期時(shí)間類型與字符串互相轉(zhuǎn)換的方法
這篇文章主要介紹了MySQL日期時(shí)間類型與字符串互相轉(zhuǎn)換的方法,文中通過代碼示例和圖文結(jié)合的方式給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-07-07
MySQL制作具有千萬(wàn)條測(cè)試數(shù)據(jù)的測(cè)試庫(kù)的方法
這篇文章主要介紹了MySQL制作具有千萬(wàn)條測(cè)試數(shù)據(jù)的測(cè)試庫(kù)的方法,幫助大家更好的理解和學(xué)習(xí)MySQL,感興趣的朋友可以了解下2020-11-11
Mysql中FIND_IN_SET函數(shù)的使用及問題
FIND_IN_SET函數(shù)用于返回字符串str在字符串列表str_list中的位置,本文主要介紹了Mysql中FIND_IN_SET函數(shù)的使用及問題,具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07
細(xì)談Mysql的存儲(chǔ)過程和存儲(chǔ)函數(shù)
存儲(chǔ)函數(shù)與存儲(chǔ)過程作用類同,不同的是存儲(chǔ)過程只能使用CALL語(yǔ)句來調(diào)用存儲(chǔ)過程,只能用輸出變量返回值,而存儲(chǔ)函數(shù)可以從語(yǔ)句外調(diào)用(即通過引用函數(shù)名),也能返回標(biāo)量值。下面小編給大家詳細(xì)講一講2019-05-05
淺談MySQL安裝starting the server失敗的解決辦法
如果電腦是不是第一次安裝MySQL,一般會(huì)出現(xiàn)報(bào)錯(cuò)情況,starting the server失敗,通常是因?yàn)樯洗伟惭b的該軟件未清除干凈,本文就詳細(xì)的介紹一下解決方法,感興趣的可以了解一下2021-09-09

