MYSQL的事務(wù)隔離級別笤受,MVCC穷缤,readView和版本鏈小結(jié)

1.MVCC

MVCC(Mutil-Version Concurrency Control),就是多版本并發(fā)控制箩兽。這種并發(fā)控制的方法津肛,主要應(yīng)用在RC和RR隔離級別的事務(wù)當(dāng)中,利用執(zhí)行select操作時汗贫,訪問記錄版本鏈身坐,使得不同事物的讀寫,寫讀可以并發(fā)執(zhí)行落包,提高系統(tǒng)性能部蛇。

2.版本鏈

Innodb 有兩個隱藏字段 trx_id(事務(wù)id)和roll_pointer(回滾指針)。
transaction id
innoDB里面每個事務(wù)有一個唯一的事務(wù)ID咐蝇,叫作transaction id涯鲁,它是在事務(wù)開始的時候向InnoDB的事務(wù)系統(tǒng)申請的,是按申請順序嚴(yán)格遞增的嘹害。
roll_pointer
指向上一事務(wù)版本的指針撮竿。
版本鏈
是一個單鏈表結(jié)構(gòu)吮便,對于同一行數(shù)據(jù)笔呀,每一個事務(wù)對其進(jìn)行更新的時候都會產(chǎn)生一個新的版本,就會存儲在這個鏈表當(dāng)中髓需。

版本鏈.png

3.ReadView

一個存儲事務(wù)id的列表许师。

readview的幾個參數(shù):
m_ids:表示活躍事務(wù)id列表
min_trx_id:活躍事務(wù)中的最小事務(wù)id
max_trx_id:已創(chuàng)建的最大事務(wù)id
creator_trx_id:當(dāng)前的事務(wù)id。
readview的生成時機(jī):
RC隔離級別:每次讀取數(shù)據(jù)前僚匆,都生成一個readview微渠;
RR隔離級別:在第一次讀取數(shù)據(jù)前,生成一個readview咧擂;

使用場景:
[ 創(chuàng)建事務(wù)節(jié)點 ] 當(dāng)我創(chuàng)建一個新的事務(wù)需要讀取一行數(shù)據(jù), 我會查詢活躍的事務(wù)列表; 假設(shè)我當(dāng)前的事務(wù)id是200, 當(dāng)前活躍的事務(wù)id沒有我的200, 因此需要去拷貝一個最新的不活躍事務(wù)并在版本鏈最后插入一個新節(jié)點200; mysql會去對比版本鏈和readView, 假設(shè)版本鏈數(shù)據(jù)為[1,50,100,150], 活躍列表為[100,150], 說明100和150都是未提交的活躍事務(wù), 再向前一個節(jié)點50不在活躍事務(wù)列表說明事務(wù)50已經(jīng)提交, 所以事務(wù)200拷貝事務(wù)50并插入版本鏈最后, 且將200追加到readView活躍列表的最后一個元素

[ 使用事務(wù)節(jié)點 ] 當(dāng)我再次進(jìn)行200號事務(wù)的查詢或修改, 我需要讀版本鏈的數(shù)據(jù), 因為上一次操作已經(jīng)在版本鏈做了200號節(jié)點, 因此我讀的數(shù)據(jù)都是200號節(jié)點的數(shù)據(jù), 這樣就隔離了其他未提交的事務(wù); 我的全部增刪查改都在200號版本鏈上進(jìn)行

[ readView實現(xiàn)事務(wù)隔離級別 ]以上兩點都是基于隔離級別"讀已提交"來進(jìn)行說明的; 當(dāng)mysql設(shè)置為"可重復(fù)讀"時, 不同事務(wù)仍然是保存在版本鏈的不同節(jié)點上, 只不過新的事務(wù)創(chuàng)建的時候拷貝了當(dāng)下的readView列表, 只要新事物不提交就一直使用這個拷貝的活躍列表; 假設(shè)此時100號數(shù)據(jù)提交了, 我在新事務(wù)執(zhí)行了select 會去查活躍列表發(fā)現(xiàn)100號事務(wù)還是未提交狀態(tài), 因此讀取到的還是50號事務(wù)提交的記錄逞盆。

4.事務(wù)的四大特性

原子性,一致性松申,隔離性云芦,持久性。

  • 原子性(Atomicity) :強(qiáng)調(diào)的事務(wù)的不可分割.
  • 一致性(Consistency) :強(qiáng)調(diào)的事務(wù)的執(zhí)行前后,數(shù)據(jù)庫的的完整性保持一致.
  • 隔離性(Isolation) :強(qiáng)調(diào)的事務(wù)的并發(fā)的訪問,一個事務(wù)的執(zhí)行,不應(yīng)該受到另一個事務(wù)的打擾.
  • 持久性(Durability) :強(qiáng)調(diào)的事務(wù)結(jié)束之后,數(shù)據(jù)就永久的保存的數(shù)據(jù)庫中.

5.事務(wù)隔離級別

未提交讀(read uncommitted)贸桶、提交讀(read committed)舅逸、可重復(fù)讀(repeatable read)、序列化讀(serializable)

  • read uncommitted:
    可以讀到其他事務(wù)未提交的數(shù)據(jù)皇筛,有可能產(chǎn)生臟讀
  • read committed:
    讀提交琉历,就是一個事務(wù)要等另一個事務(wù)提交后才能讀取數(shù)據(jù)。
    有可能產(chǎn)生無法讀取到最初的原數(shù)據(jù),即不可重復(fù)讀旗笔。
  • repeatable read:
    重復(fù)讀彪置,就是在開始讀取數(shù)據(jù)(事務(wù)開啟)時,不再允許修改操作换团。
    但是悉稠,不可重復(fù)讀對應(yīng)的是修改,即UPDATE操作艘包。但是可能還會有幻讀問題的猛。因為幻讀問題對應(yīng)的是插入INSERT操作,而不是UPDATE操作想虎。
  • Serializable :
    Serializable 是最高的事務(wù)隔離級別卦尊,在該級別下,事務(wù)串行化順序執(zhí)行舌厨,可以避免臟讀岂却、不可重復(fù)讀與幻讀。但是這種事務(wù)隔離級別效率低下裙椭,比較耗數(shù)據(jù)庫性能躏哩,一般不使用。
隔離級別.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末揉燃,一起剝皮案震驚了整個濱河市扫尺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌炊汤,老刑警劉巖正驻,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異抢腐,居然都是意外死亡姑曙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門迈倍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伤靠,“玉大人,你說我怎么就攤上這事啼染⊙绾希” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵提完,是天一觀的道長形纺。 經(jīng)常有香客問我,道長徒欣,這世上最難降的妖魔是什么逐样? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上脂新,老公的妹妹穿的比我還像新娘挪捕。我一直安慰自己,他們只是感情好争便,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布级零。 她就那樣靜靜地躺著,像睡著了一般滞乙。 火紅的嫁衣襯著肌膚如雪奏纪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天斩启,我揣著相機(jī)與錄音序调,去河邊找鬼。 笑死兔簇,一個胖子當(dāng)著我的面吹牛发绢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播垄琐,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼边酒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了狸窘?” 一聲冷哼從身側(cè)響起墩朦,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎朦前,沒想到半個月后介杆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鹃操,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡韭寸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了荆隘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恩伺。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖椰拒,靈堂內(nèi)的尸體忽然破棺而出晶渠,到底是詐尸還是另有隱情,我是刑警寧澤燃观,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布褒脯,位于F島的核電站,受9級特大地震影響缆毁,放射性物質(zhì)發(fā)生泄漏番川。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望颁督。 院中可真熱鬧践啄,春花似錦、人聲如沸沉御。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吠裆。三九已至伐谈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間试疙,已是汗流浹背衩婚。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留效斑,地道東北人非春。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像缓屠,于是被迫代替她去往敵國和親奇昙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351

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

  • 前言 現(xiàn)在已經(jīng)知道了sql四種隔離級別分別為 RU敌完、RC储耐、RR和串行化。 而我們熟悉的MySQL的默認(rèn)隔離級別是第...
    Colors_boy閱讀 1,733評論 2 14
  • MVCC 筆記 MVCC為了解決什么問題滨溉? 多版本并發(fā)控制什湘,針對在并發(fā)訪問數(shù)據(jù)庫時對于數(shù)據(jù)版本的控制以及隔離性問題...
    劉凝云閱讀 557評論 0 0
  • 眾所周知,mysql中讀取方式按照是否需要傳統(tǒng)意義的鎖晦攒,分為鎖定讀和非鎖定讀兩種闽撤。鎖定讀不用多說,那就一堆算法了脯颜,...
    Whoami令狐沖閱讀 1,082評論 0 1
  • 什么是MVCC? ??英文全稱為Multi-Version Concurrency Control,翻譯為中文即 ...
    凡人多煩事_71de閱讀 331評論 0 0
  • 版本鏈機(jī)制 , readView innodb表下存在兩個隱藏列: trx_id : 存放事務(wù)id roll_po...
    X1_blog閱讀 4,412評論 1 1