MVCC我知道靶衍,但是為什么要設(shè)計(jì)間隙鎖灾炭?

從設(shè)計(jì)的角度上,為什么要設(shè)計(jì)出MVCC颅眶,且RC和RR的隔離級(jí)別到底有什么不同蜈出。

MVCC作用

MVCC使得大部分支持行鎖的事務(wù)引擎,不再單純的使用行鎖來進(jìn)行數(shù)據(jù)庫的并發(fā)控制涛酗,而是把數(shù)據(jù)庫的行鎖和行的版本號(hào)結(jié)合起來铡原,只需要很小的開銷,就可以實(shí)現(xiàn)非鎖定讀商叹。從而提高數(shù)據(jù)庫的并發(fā)性能眷蜈。

MVCC是采用無鎖的形式解決讀-寫沖突問題。這里的讀是指的快照讀沈自。即MVCC實(shí)現(xiàn)的快照讀W萌濉!枯途!

什么是MVCC

多版本并發(fā)控制(MVCC)是一種解決讀-寫沖突的無鎖并發(fā)控制忌怎。

每一行記錄都有兩個(gè)隱藏列:創(chuàng)建版本號(hào)和回滾指針籍滴。事務(wù)開啟后存在一個(gè)事務(wù)id。多個(gè)并發(fā)事務(wù)同時(shí)操作某行榴啸,不同的事務(wù)對(duì)該行update操作會(huì)產(chǎn)生多個(gè)版本孽惰,然后通過回滾指針組成undo log鏈。而MVCC的快照讀正是通過事務(wù)id和創(chuàng)建版本號(hào)從而實(shí)現(xiàn)的快照讀鸥印。

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

MVCC是為了解決讀-寫問題勋功。且通過不同的配置,也可以解決事務(wù)開啟后库说,快照讀不可重復(fù)讀的問題狂鞋。

  • 不可重復(fù)讀:同一個(gè)事務(wù)中讀取某些數(shù)據(jù)已經(jīng)發(fā)生改變,或某些記錄已經(jīng)刪除潜的。

  • 幻讀:一個(gè)事務(wù)按照相同的查詢條件重新讀取以前檢索過的數(shù)據(jù)骚揍,卻發(fā)現(xiàn)其他事務(wù)插入了滿足查詢條件的新數(shù)據(jù),這種現(xiàn)象被稱為幻讀啰挪。

RC和RR均實(shí)現(xiàn)了MVCC信不,但是為什么RR解決了RC不可重復(fù)讀的問題?

你可以這樣認(rèn)為亡呵,RC之所以有不可重復(fù)讀的問題抽活,只是因?yàn)殚_發(fā)者有意設(shè)置的(設(shè)置多種隔離級(jí)別,用戶可以根據(jù)情況設(shè)置)锰什。本來數(shù)據(jù)都提交到數(shù)據(jù)庫了酌壕,RC讀取出來也沒什么問題呀?況且Oracle數(shù)據(jù)庫本身的隔離級(jí)別就是RC歇由。

READ-COMMITTED(讀已提交)
讀已提交RC,在這一隔離級(jí)別下果港,可以在SQL級(jí)別做到一致性讀沦泌,每次SQL語句都會(huì)產(chǎn)生新的ReadView。這就意味著兩次查詢之間有別的事務(wù)提交了辛掠,是可以讀到不一致的數(shù)據(jù)的谢谦。

REPEATABLE-READ(可重復(fù)讀)
可重復(fù)讀RR,在第一次創(chuàng)建ReadView后萝衩,這個(gè)ReadView就會(huì)一直維持到事務(wù)結(jié)束回挽,也就是說,在事務(wù)執(zhí)行期間可見性不會(huì)發(fā)生變化猩谊,從而實(shí)現(xiàn)了事務(wù)內(nèi)的可重復(fù)讀千劈。

MVCC和間隙鎖

MVCC無鎖解決了讀-寫沖突的問題。并且解決了不可重復(fù)讀問題牌捷。從而實(shí)現(xiàn)了RC和RR兩個(gè)隔離級(jí)別墙牌。

間隙鎖本質(zhì)上依舊是鎖涡驮,會(huì)阻塞兩個(gè)并發(fā)事務(wù)的執(zhí)行。

那么RR為什么還要進(jìn)入間隙鎖喜滨,難道僅僅為了解決幻讀的問題嗎捉捅?

注意:只有RR隔離級(jí)別才存在間隙鎖。

間隙鎖在一定程度上可以解決幻讀的問題虽风,但是間隙鎖的引入我覺得更多是為了處理binlog的statement模式的bug棒口。

mysql數(shù)據(jù)庫的主從復(fù)制依靠的是binlog。而在mysql5.0之前辜膝,binlog模式只有statement格式无牵。這種模式的特點(diǎn):binlog的記錄順序是按照數(shù)據(jù)庫事務(wù)commit順序?yàn)轫樞虻摹?/p>

當(dāng)不存在間隙鎖的情況下,會(huì)有如下的場(chǎng)景:
master庫有這么兩個(gè)事務(wù):

1内舟、事務(wù)a先delete id<6合敦,然后在commit前;
2验游、事務(wù)b直接insert id=3充岛,并且完成commit;
3耕蝉、事務(wù)a進(jìn)行commit崔梗;
此時(shí)binlog記錄的日志是:事務(wù)b先執(zhí)行,事務(wù)a在執(zhí)行(binlog記錄的是commit順序)

那么主庫此時(shí)表里面有id=3的記錄垒在,但是從庫是先插入再刪除蒜魄,從庫里面是沒有記錄的。

這就導(dǎo)致了主從數(shù)據(jù)不一致场躯。

為了解決這個(gè)bug谈为,所以RR級(jí)別引入了間隙鎖。

推薦閱讀

聊一聊MVCC是怎么回事

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末踢关,一起剝皮案震驚了整個(gè)濱河市伞鲫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌签舞,老刑警劉巖秕脓,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異儒搭,居然都是意外死亡吠架,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門搂鲫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來傍药,“玉大人,你說我怎么就攤上這事≌荩” “怎么了褪秀?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長薛训。 經(jīng)常有香客問我媒吗,道長,這世上最難降的妖魔是什么乙埃? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任闸英,我火速辦了婚禮,結(jié)果婚禮上介袜,老公的妹妹穿的比我還像新娘甫何。我一直安慰自己,他們只是感情好遇伞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布辙喂。 她就那樣靜靜地躺著,像睡著了一般鸠珠。 火紅的嫁衣襯著肌膚如雪巍耗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天渐排,我揣著相機(jī)與錄音炬太,去河邊找鬼。 笑死驯耻,一個(gè)胖子當(dāng)著我的面吹牛亲族,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播可缚,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼霎迫,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了帘靡?” 一聲冷哼從身側(cè)響起知给,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎测柠,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缘滥,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡轰胁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了朝扼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赃阀。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出榛斯,到底是詐尸還是另有隱情观游,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布驮俗,位于F島的核電站懂缕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏王凑。R本人自食惡果不足惜搪柑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望索烹。 院中可真熱鬧工碾,春花似錦、人聲如沸百姓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垒拢。三九已至旬迹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間子库,已是汗流浹背舱权。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留仑嗅,地道東北人宴倍。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像仓技,于是被迫代替她去往敵國和親鸵贬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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

  • 最近要在公司內(nèi)做一次技術(shù)分享脖捻,思來想去不知道該分享些什么阔逼,最后在朋友的提示下,準(zhǔn)備分享一下MySQL的InnoDB...
    阿Q說代碼閱讀 585評(píng)論 0 3
  • 1 Mysql中的一些日志文件跟事務(wù)隔離性的介紹 1.1 redo log redo log就是保存執(zhí)行的SQL語...
    小狐憨憨閱讀 833評(píng)論 0 0
  • 原文:http://seven.geekfun.club/article/16 談到MySQL事務(wù)地沮,必然離不開In...
    SEVEN_12cd閱讀 13,969評(píng)論 14 35
  • 表情是什么嗜浮,我認(rèn)為表情就是表現(xiàn)出來的情緒。表情可以傳達(dá)很多信息摩疑。高興了當(dāng)然就笑了危融,難過就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 125,004評(píng)論 2 7
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險(xiǎn)厭惡者雷袋,不喜歡去冒險(xiǎn)吉殃,但是人生放棄了冒險(xiǎn),也就放棄了無數(shù)的可能。 ...
    yichen大刀閱讀 6,049評(píng)論 0 4