6.技術-mysql(六)-MVCC(多版本控制)實現(xiàn)

一.背景

? ? 數(shù)據(jù)庫為了實現(xiàn)讀寫并行凫海,也就是說某一行數(shù)據(jù)在修改的時候會阻塞其他線程修改但不會阻塞讀,其他線程還可以讀男娄,因為大部分程序都是讀多于寫行贪,從而大大提升并發(fā)性能漾稀,使用MVCC (Multiversion Concurrency Control)即多版本并發(fā)控制方式實現(xiàn)。

? ? 大部分主流的數(shù)據(jù)庫比如mysql建瘫、oracle都是采用這種方式實現(xiàn)崭捍。

? ? 通過學習這種機制來更加了解數(shù)據(jù)庫底層實現(xiàn)細節(jié)同時也是學習這種設計思想。

二.DML整體處理流程

上面流程中看出來:

一筆update請求在innodb中主要做以下操作:

1>.收到當前讀請求加鎖并返回數(shù)據(jù)給server啰脚。

2>.server過濾完數(shù)據(jù)殷蛇,對滿足條件的數(shù)據(jù)發(fā)起更新。

3>.innodb收到發(fā)起更新操作并不是修改原數(shù)據(jù)橄浓,而是copy一份出來粒梦,寫入undo緩沖中,異步線程刷入位于共享表空間中undo文件荸实。

4>.insert一條新紀錄到redo日志到LRU列表大約37%處匀们,Page Clearner線程會定時通過checkpoint機制將臟頁刷新回磁盤。

5>.server發(fā)起commit

寫binlog到緩沖區(qū)准给,默認sync_binlog=0則異步刷盤泄朴,發(fā)提交請求

innodb釋放鎖記錄X鎖,釋放頁表庫的IX鎖露氮,

undo日志設置刪除標記為1祖灰,會被purge線程定時清理掉。

寫提交記錄到history list畔规,用于回放redo日志判斷是否提交(redo因為記錄的是物理日志所以是冪等的局扶,重放多次結果都一樣)。

注:因為redo日志在事務未提交之前已經(jīng)寫好了叁扫,所以很大的事物提交也是很快的三妈,大部分工作都在事務進行中完成了。

Q:讀線程怎么讀到原來的數(shù)據(jù)陌兑?下面來看沈跨。

三.MVCC實現(xiàn)

接著上面的問題讀線程怎么讀到原來的數(shù)據(jù),來實現(xiàn)事務隔離級別呢由捎?

Innodb每行記錄都有兩個隱藏字段:

DB_TRX_ID?:事務id兔综,數(shù)據(jù)庫為事務維護一個自增的序列,存該序列值狞玛。

DB_ROLL_PTR:回滾指針软驰,用于update查詢或回滾尋找undo版本數(shù)據(jù)。

當插入一條數(shù)據(jù)回滾段指針為NULL心肪,事務id為當前事務id锭亏,因為這個不需要提供給其他線程讀。

更新事務:

1.當前讀返回并加鎖硬鞍。

2.把該行的邏輯值copy到undo緩沖區(qū)

3.?插入一條新記錄慧瘤,填寫事務編號和回滾指針

4.記錄redo日志戴已。

MySQL就是根據(jù)事務ID判斷記錄是否可見,如果不可見繼續(xù)按照DB_ROLL_PTR繼續(xù)回溯查找锅减。

四.MVCC如何判斷記錄可見

可見性分析:

假設原數(shù)據(jù)如下:

原數(shù)據(jù):(新插入已提交)

idnameDB_TRX_IDDB_ROLL_PTR

? ? ? 1? ? mbj? ? ? ? 1

執(zhí)行update操作 :update t_user set name='mbj1' where id=1;

undo日志:(原數(shù)據(jù)copy一份出來至undo緩存中)

地址idnameDB_TRX_IDDB_ROLL_PTR

? ?A100? ? ? 1? ? mbj? ? ? ? 1

LRU數(shù)據(jù):(插入一條新數(shù)據(jù)至數(shù)據(jù)緩存池糖儡,當前事務正在修改未提交)

idnameDB_TRX_IDDB_ROLL_PTR

? ? ? 1? ?mbj1? ? ? ?2? ? ? A100

? ? 不同的隔離級別,數(shù)據(jù)的可見度不同怔匣。 RC隔離級別下允許幻讀握联,期間新插入的數(shù)據(jù)是可以看到,RR下不允許每瞒。

innodb為了能支持多個事務同時查詢金闽,會將當前系統(tǒng)中的所有的進行中的事務拷貝到一個列表中(read view),

RC隔離級別剿骨,在事務中的每個語句開始時代芜,copy活躍事務到read view。

RR隔離級別懦砂,在每個事務開始的時候蜒犯,copy活躍事務到read view。

假設此時事務2:update t_user set name='mbj2' where id=1;(事務1未提交)

事務2 read view中有1荞膘。

獲取數(shù)據(jù)DB_TRX_ID=1罚随,因為1在read view中所以不展示,找到undo回滾數(shù)據(jù)DB_TRX_ID=0羽资,同時DB_TRX_ID<當前事務id淘菩,也就是2.都滿足,則返回數(shù)據(jù)屠升。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末潮改,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子腹暖,更是在濱河造成了極大的恐慌汇在,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脏答,死亡現(xiàn)場離奇詭異糕殉,居然都是意外死亡,警方通過查閱死者的電腦和手機殖告,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門阿蝶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人黄绩,你說我怎么就攤上這事羡洁。” “怎么了爽丹?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵筑煮,是天一觀的道長辛蚊。 經(jīng)常有香客問我,道長真仲,這世上最難降的妖魔是什么嚼隘? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮袒餐,結果婚禮上飞蛹,老公的妹妹穿的比我還像新娘。我一直安慰自己灸眼,他們只是感情好卧檐,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著焰宣,像睡著了一般霉囚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上匕积,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天盈罐,我揣著相機與錄音,去河邊找鬼闪唆。 笑死盅粪,一個胖子當著我的面吹牛,可吹牛的內容都是我干的悄蕾。 我是一名探鬼主播票顾,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼帆调!你這毒婦竟也來了奠骄?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤番刊,失蹤者是張志新(化名)和其女友劉穎含鳞,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芹务,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡蝉绷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了锄禽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片潜必。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡靴姿,死狀恐怖沃但,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情佛吓,我是刑警寧澤宵晚,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布垂攘,位于F島的核電站,受9級特大地震影響淤刃,放射性物質發(fā)生泄漏晒他。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一逸贾、第九天 我趴在偏房一處隱蔽的房頂上張望陨仅。 院中可真熱鬧,春花似錦铝侵、人聲如沸灼伤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狐赡。三九已至,卻和暖如春疟丙,著一層夾襖步出監(jiān)牢的瞬間颖侄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工享郊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留览祖,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓炊琉,卻偏偏與公主長得像穴墅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子温自,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內容