Mysql MVCC機(jī)制 && 主從復(fù)制三大模式

1刹帕、MVCC

  1. 簡單講講你對 MVCC 的理解。

MVCC在MySQL InnoDB中的實(shí)現(xiàn)主要是為了提高數(shù)據(jù)庫并發(fā)性能谎替,用更好的方式去處理讀-寫沖突偷溺,做到即使有讀寫沖突時(shí),也能做到不加鎖钱贯,做到非阻塞并發(fā)讀挫掏。

  1. MVCC多版本并發(fā)控制的原理

通過undo_log多版本鏈條,加上開啟事務(wù)時(shí)產(chǎn)生的readView(不同隔離級(jí)別有不同產(chǎn)生策略),然后再有一個(gè)查詢的時(shí)候,根據(jù)readView進(jìn)行判斷的機(jī)制秩命,來決定讀取哪個(gè)版本的數(shù)據(jù)尉共。實(shí)現(xiàn)了多事務(wù)并發(fā)執(zhí)行,保證只能讀開啟事務(wù)前提交的數(shù)據(jù)和當(dāng)前事務(wù)修改的數(shù)據(jù)弃锐,其他情況都不會(huì)讀到袄友。

也就是說,不管事務(wù)執(zhí)行多長時(shí)間霹菊,事務(wù)內(nèi)部看到的數(shù)據(jù)是不受其它事務(wù)影響的剧蚣,根據(jù)事務(wù)開始的時(shí)間不同,不同事務(wù)對同一張表浇辜,同一時(shí)刻看到的數(shù)據(jù)可能是不一樣的券敌。

MVCC實(shí)現(xiàn)

隱式字段

在表中,除了我們自定義的列柳洋,實(shí)際上MySQL會(huì)隱式的定義三個(gè)字段

  • DB_TRX_ID事務(wù)ID待诅,創(chuàng)建這條記錄/最后一次修改該記錄的事務(wù)ID

  • DB_ROLL_PTR回滾指針,指向這條記錄的上一個(gè)版本

  • DB_ROW_ID:隱含的自增ID(隱藏主鍵)熊镣,如果數(shù)據(jù)表沒有主鍵卑雁,InnoDB會(huì)自動(dòng)以DB_ROW_ID`產(chǎn)生一個(gè)聚簇索引

undo_log 日志版本鏈

undo_log 版本鏈?zhǔn)侵敢恍袛?shù)據(jù)被多個(gè)事務(wù)依次修改過后募书,在每個(gè)事務(wù)修改完后,Mysql會(huì)保留修改前的數(shù)據(jù)undo回滾日志测蹲,并且用兩個(gè)隱藏字段trx_id和roll_pointer把這些undo日志串聯(lián)起來形成一個(gè)歷史記錄版本鏈

  • insert undo log:代表事務(wù)在insert新紀(jì)錄時(shí)產(chǎn)生的undo_log莹捡,只在事務(wù)回滾時(shí)需要,并且在事務(wù)提交后可以被立即拋棄扣甲。

  • update undo log:事務(wù)在update或者delete時(shí)產(chǎn)生的undo log篮赢,不僅在事務(wù)回滾時(shí)需要,在快照讀時(shí)也需要琉挖;所以不能隨便刪除启泣,只要在快速讀或者事務(wù)回滾不涉及該日志時(shí),對應(yīng)的日志才會(huì)被purge線程統(tǒng)一清除示辈。

image.png

Read View

Read View是事務(wù)進(jìn)行快照讀操作時(shí)產(chǎn)生的讀視圖(RV),在該事務(wù)執(zhí)行快照讀的那一刻寥茫,會(huì)生成數(shù)據(jù)庫系統(tǒng)的當(dāng)前的一個(gè)快照,記錄并維護(hù)當(dāng)前活躍事務(wù)的ID(當(dāng)每個(gè)事務(wù)開啟時(shí)矾麻,都會(huì)被分配一個(gè)ID纱耻,這個(gè)ID是自增的,所以最新的事務(wù)险耀,ID值越大)

RV主要是用來做可見行判斷的弄喘,即當(dāng)我們某個(gè)事務(wù)執(zhí)行快照讀的時(shí)候,對該記錄創(chuàng)建一個(gè)RV讀視圖胰耗,把它比作條件來判斷當(dāng)前事務(wù)能夠看到哪個(gè)版本的數(shù)據(jù)限次,既可能是當(dāng)前最新的數(shù)據(jù),也有可能是該行記錄的undo log里面的某個(gè)版本的數(shù)據(jù)柴灯。

RV遵循一個(gè)可見性算法卖漫,主要是將要被修改的數(shù)據(jù)的最新記錄的DB_TRX_ID(即當(dāng)前事務(wù)ID),與系統(tǒng)當(dāng)前其他活躍事務(wù)的ID去對比(由RV維護(hù)),如果DB_TRX_ID跟RV的屬性做了某些對比赠群,不符合可見性羊始,那么就由DB_ROLL_PTR回滾指針去取出undo log中的DB_TRX_ID再比較,即遍歷鏈表的DB_TRX_ID(從鏈表頭到尾查描,即從最近的一次修改查起)突委,直到找到滿足特定條件的DB_TRX_ID,那么這個(gè)DB_TRX_ID所在的舊記錄就是當(dāng)前事務(wù)能看見的最新老版本

實(shí)現(xiàn)流程

image.png

事務(wù)隔離級(jí)別與MVCC的關(guān)系

  • REPEATABLE READ(可重復(fù)讀) REPEATABLE READ級(jí)別會(huì)使用MVCC冬三,只有在第一次進(jìn)行快照讀會(huì)生成read view匀油,之后的快照讀都會(huì)沿用第一次生成的read view,所以每次快照讀讀到的數(shù)據(jù)都是一樣的勾笆,這樣就可以解決臟讀問題以及快照讀的不可重復(fù)讀敌蚜、幻讀問題。

這就是上面說的窝爪,只能讀開啟事務(wù)前提交的數(shù)據(jù)和當(dāng)前事務(wù)修改的數(shù)據(jù)弛车,其他情況都不會(huì)讀到齐媒。

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

  • 當(dāng)前讀

像select lock in share mode(共享鎖); select for update, update,delete纷跛,insert(排它鎖)這些操作就是一種當(dāng)前讀喻括,因?yàn)樗x取的是數(shù)據(jù)的最新版本,讀取時(shí)還要保證其他事務(wù)不能修改當(dāng)前記錄贫奠,會(huì)對記錄進(jìn)行加鎖唬血。

  • 快照讀

不加鎖的select就是快照讀,即不加鎖的非阻塞讀叮阅;(快照讀的前提是隔離級(jí)別不是串行化刁品,串行化的隔離級(jí)別下快照讀會(huì)退化成當(dāng)前讀) 之所以出現(xiàn)快照讀的情況,是基于提高并發(fā)性能的考慮浩姥,快照讀的實(shí)現(xiàn)是基于多版本并發(fā)控制,即MVCC状您,可以認(rèn)為MVCC是行鎖的一個(gè)變種勒叠,但是它在很多情況下避免了加鎖操作,降低了開銷膏孟,既然是基于多版本眯分,所以快照讀可能讀到的不一定是數(shù)據(jù)的最新版本,而有可能是之前的歷史版本

2柒桑、Mysql主從復(fù)制三大模式

sync :全同步

當(dāng)主庫執(zhí)行完一個(gè)事務(wù)弊决,所有的從庫都執(zhí)行了該事務(wù)才會(huì)將結(jié)果返回給客戶端。這樣保證了數(shù)據(jù)的安全性魁淳,但是因?yàn)樾枰却袕膸靾?zhí)行完該事務(wù)才能返回客戶端結(jié)果飘诗,所以全同步復(fù)制的性能必然會(huì)受到很大的影響。
對于全同步復(fù)制而言界逛,當(dāng)主庫提交一個(gè)事務(wù)后昆稿,要求所有從庫節(jié)點(diǎn)必須收到,執(zhí)行并提交這些事務(wù)息拜,然后主庫線程才能繼續(xù)做后續(xù)操作溉潭,而因此帶來的問題就是主庫完成一個(gè)事務(wù)的時(shí)間被大幅度拉長,性能降低少欺。

async : 異步

主庫在執(zhí)行完客戶端提交的事務(wù)后會(huì)立刻將執(zhí)行結(jié)果返回給客戶端喳瓣,并不關(guān)心從庫是否已經(jīng)接收處理,這樣帶來的問題就是當(dāng)主死掉了赞别,此時(shí)主上提交的事務(wù)可能還沒有傳到從上畏陕。而強(qiáng)行將從提升為主就會(huì)導(dǎo)致新主上的數(shù)據(jù)不完整。

semi-sync : 半同步

介于異步復(fù)制和全同步復(fù)制之間氯庆,主庫在執(zhí)行完客戶端提交的事務(wù)后不是立刻返回給客戶端蹭秋,而是等待至少一個(gè)從庫接收并寫到relay log中才返回給客戶端扰付。相對于異步復(fù)制,半同步復(fù)制提高了數(shù)據(jù)的安全性仁讨,同時(shí)也會(huì)造成一定程度的延遲羽莺,這個(gè)延遲為一個(gè)TCP/IP往返的時(shí)間。所以半同步復(fù)制需要在低延時(shí)的網(wǎng)絡(luò)中使用洞豁。
對于半同步復(fù)制而言盐固,是介于同步復(fù)制和異步復(fù)制之間的一種,主庫需要等待至少一個(gè)從庫節(jié)點(diǎn)收到并且刷新binlog到relay日志中丈挟,主庫不需要等待所有從庫給主庫反饋刁卜,同時(shí)這里只是收到反饋而不死和完全執(zhí)行并且提交事務(wù)的反饋,這樣會(huì)節(jié)省很多的時(shí)間曙咽。

總結(jié):實(shí)際業(yè)務(wù)中蛔趴,一般都是配置使用半同步的,全同步高并發(fā)下有性能問題例朱,異步有數(shù)據(jù)丟失的可能孝情,所以,還是使用半同步洒嗤。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末箫荡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子渔隶,更是在濱河造成了極大的恐慌羔挡,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,029評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件间唉,死亡現(xiàn)場離奇詭異绞灼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)终吼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門镀赌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人际跪,你說我怎么就攤上這事商佛。” “怎么了姆打?”我有些...
    開封第一講書人閱讀 157,570評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵良姆,是天一觀的道長。 經(jīng)常有香客問我幔戏,道長玛追,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,535評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮痊剖,結(jié)果婚禮上韩玩,老公的妹妹穿的比我還像新娘。我一直安慰自己陆馁,他們只是感情好找颓,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著叮贩,像睡著了一般击狮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上益老,一...
    開封第一講書人閱讀 49,850評(píng)論 1 290
  • 那天彪蓬,我揣著相機(jī)與錄音,去河邊找鬼捺萌。 笑死档冬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的桃纯。 我是一名探鬼主播捣郊,決...
    沈念sama閱讀 39,006評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼慈参!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起刮萌,我...
    開封第一講書人閱讀 37,747評(píng)論 0 268
  • 序言:老撾萬榮一對情侶失蹤驮配,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后着茸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體壮锻,經(jīng)...
    沈念sama閱讀 44,207評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評(píng)論 2 327
  • 正文 我和宋清朗相戀三年涮阔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了猜绣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,683評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡敬特,死狀恐怖掰邢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情伟阔,我是刑警寧澤辣之,帶...
    沈念sama閱讀 34,342評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站皱炉,受9級(jí)特大地震影響怀估,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評(píng)論 3 315
  • 文/蒙蒙 一多搀、第九天 我趴在偏房一處隱蔽的房頂上張望歧蕉。 院中可真熱鬧,春花似錦康铭、人聲如沸惯退。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蒸痹。三九已至,卻和暖如春呛哟,著一層夾襖步出監(jiān)牢的瞬間叠荠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評(píng)論 1 266
  • 我被黑心中介騙來泰國打工扫责, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留榛鼎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,401評(píng)論 2 360
  • 正文 我出身青樓鳖孤,卻偏偏與公主長得像者娱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子苏揣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 我們都知道事務(wù)的4個(gè)特性,原子性 一致性 隔離性和持久化事務(wù)具有4個(gè)特征黄鳍,分別是原子性、一致性平匈、隔離性和持久性框沟,簡...
    念?閱讀 1,234評(píng)論 0 0
  • 1、前言 mvcc 即多版本并發(fā)控制增炭,即通過多版本的方式實(shí)現(xiàn)讀寫數(shù)據(jù)的高并發(fā)忍燥,主要是通過多版本和鎖來實(shí)現(xiàn)的。多版本...
    放開那個(gè)BUG閱讀 170評(píng)論 0 1
  • 一、并發(fā)事務(wù)的四種場景 并發(fā)事務(wù)中又會(huì)分為四種情況输玷,分別是讀-讀队丝、寫-寫、讀-寫饲嗽、寫-讀炭玫,這四種情況分別對應(yīng)并發(fā)事...
    小二上酒8閱讀 110評(píng)論 0 0
  • MVCC并發(fā)控制中,讀操作可以分成兩類:快照讀 (snapshot read)與當(dāng)前讀 (current read...
    尹楷楷閱讀 1,090評(píng)論 0 5
  • 1.文章適用對象: 能夠基本描述清楚mysql事務(wù)隔離級(jí)別 不可重復(fù)去或可重復(fù)讀的現(xiàn)象,想進(jìn)一步探討底層設(shè)計(jì)思想的...
    華北_b5ef閱讀 1,382評(píng)論 0 1