MySQL中的MVCC

MVVC概念

  1. Multi-Version Concurrency Control :多版本并發(fā)控制

  2. 優(yōu)勢(shì):

    • 允許多個(gè)版本同時(shí)存在生蚁,并發(fā)執(zhí)行肋拔。

    • 不依賴鎖機(jī)制氛魁,性能高。

    • 只在RC與RR級(jí)別下工作(其他隔離級(jí)別沒有意義)乖篷。

    • 只有在InnoDB下支持。

實(shí)現(xiàn)原理

1. 隱藏列

InnoDB存儲(chǔ)引擎中透且,它的聚簇索引記錄中都包含兩個(gè)必要的隱藏列(row_id并不是必要的撕蔼,我們創(chuàng)建的表中有主鍵或者非NULL的UNIQUE鍵時(shí)都不會(huì)包含row_id列):

  • trx_id:每次一個(gè)事務(wù)對(duì)某條聚簇索引記錄進(jìn)行改動(dòng)時(shí),都會(huì)把該事務(wù)的事務(wù)id賦值給trx_id隱藏列秽誊。

  • roll_pointer:每次對(duì)某條聚簇索引記錄進(jìn)行改動(dòng)時(shí)鲸沮,都會(huì)把舊的版本寫入到undo日志中,然后這個(gè)隱藏列就相當(dāng)于一個(gè)指針锅论,可以通過(guò)它來(lái)找到該記錄修改前的信息讼溺。

當(dāng)MVCC數(shù)據(jù)庫(kù)需要對(duì)一條記錄操作的時(shí)候,它不會(huì)直接在老的數(shù)據(jù)上行直接修改最易,而是創(chuàng)建新的數(shù)據(jù)行怒坯,包含上述兩個(gè)字段,這樣儲(chǔ)存多個(gè)版本的數(shù)據(jù)藻懒,就有效的防止了并發(fā)讀寫的問題剔猿。

2.事務(wù)鏈

每次對(duì)記錄進(jìn)行改動(dòng),都會(huì)記錄一條undo日志嬉荆,每條undo日志也都有一個(gè)roll_pointer屬性(INSERT操作對(duì)應(yīng)的undo日志沒有該屬性归敬,因?yàn)樵撚涗洸]有更早的版本),可以將這些undo日志都連起來(lái),串成一個(gè)鏈表汪茧。

ReadView

對(duì)于RU級(jí)別的事務(wù)椅亚,每次都可以讀取到未提交的修改記錄,而SERIALIZABLE級(jí)別下通過(guò)加鎖來(lái)訪問記錄舱污。而在RCRR級(jí)別下都要讀取到已經(jīng)提交的記錄什往,也就是說(shuō)假如另一個(gè)事務(wù)已經(jīng)修改了記錄但是尚未提交,是不能直接讀取最新版本的記錄的慌闭,核心問題就是:需要判斷一下版本鏈中的哪個(gè)版本是當(dāng)前事務(wù)可見的别威。為此,設(shè)計(jì)InnoDB的大叔提出了一個(gè)ReadView的概念驴剔,這個(gè)ReadView中主要包含4個(gè)比較重要的內(nèi)容:

  • m_ids:表示在生成ReadView時(shí)當(dāng)前系統(tǒng)中活躍的讀寫事務(wù)的事務(wù)id列表省古。

  • min_trx_id:表示在生成ReadView時(shí)當(dāng)前系統(tǒng)中活躍的讀寫事務(wù)中最小的事務(wù)id,也就是m_ids中的最小值丧失。

  • max_trx_id:表示生成ReadView時(shí)系統(tǒng)中應(yīng)該分配給下一個(gè)事務(wù)的id值豺妓。

對(duì)于RC與RR他們的區(qū)別是:

RC級(jí)別下可以讀取別的事務(wù)提交后的修改,而RR級(jí)別讀取不到布讹。

之所以有這個(gè)差別是因?yàn)椋核麄兩蒖eadView的時(shí)機(jī)不同:

  • 在RC下:每個(gè)select都會(huì)創(chuàng)建一個(gè)ReadView琳拭,也就是說(shuō)每個(gè)select語(yǔ)句都會(huì)讀取目前已經(jīng)提交的新數(shù)據(jù)。

  • 在RR下:當(dāng)事務(wù)的第一個(gè)select語(yǔ)句后創(chuàng)建一個(gè)ReadView描验,之后讀取的都是這個(gè)ReadView白嘁。

快照讀與當(dāng)前讀

在RR級(jí)別下快照讀(snapshot read)是通過(guò)MVCC與undo log實(shí)現(xiàn)的,它能防止不可重復(fù)讀問題膘流,缺不能杜絕幻讀絮缅。

當(dāng)前讀(current read)通過(guò)record lock與gap lock實(shí)現(xiàn),可以杜絕幻讀問題呼股。

https://dev.mysql.com/doc/refman/5.7/en/innodb-multi-versioning.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末耕魄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子彭谁,更是在濱河造成了極大的恐慌吸奴,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缠局,死亡現(xiàn)場(chǎng)離奇詭異则奥,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)甩鳄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門逞度,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人妙啃,你說(shuō)我怎么就攤上這事档泽】〈粒” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵馆匿,是天一觀的道長(zhǎng)抑胎。 經(jīng)常有香客問我,道長(zhǎng)渐北,這世上最難降的妖魔是什么阿逃? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮赃蛛,結(jié)果婚禮上恃锉,老公的妹妹穿的比我還像新娘。我一直安慰自己呕臂,他們只是感情好破托,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著歧蒋,像睡著了一般土砂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谜洽,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天萝映,我揣著相機(jī)與錄音,去河邊找鬼阐虚。 笑死序臂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的敌呈。 我是一名探鬼主播贸宏,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼磕洪!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起诫龙,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤析显,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后签赃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谷异,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年锦聊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了歹嘹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡孔庭,死狀恐怖尺上,靈堂內(nèi)的尸體忽然破棺而出材蛛,到底是詐尸還是另有隱情,我是刑警寧澤怎抛,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布卑吭,位于F島的核電站,受9級(jí)特大地震影響马绝,放射性物質(zhì)發(fā)生泄漏豆赏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一富稻、第九天 我趴在偏房一處隱蔽的房頂上張望掷邦。 院中可真熱鬧,春花似錦椭赋、人聲如沸抚岗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)苟跪。三九已至,卻和暖如春蔓涧,著一層夾襖步出監(jiān)牢的瞬間件已,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工元暴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留篷扩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓茉盏,卻偏偏與公主長(zhǎng)得像鉴未,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鸠姨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348