深入理解mysql多版本并發(fā)控制(mvcc)

MVCC

Multi-Version Concurrency Control 多版本并發(fā)控制蹈矮,MVCC 是一種并發(fā)控制的方法.在innodb中你可以把MVCC看成行鎖的一種妥協(xié),它在許多情況下避免了使用鎖疏叨,同時(shí)可以提供更小的開銷智玻。根據(jù)實(shí)現(xiàn)的不同,它可以允許非阻塞式讀,在寫操作進(jìn)行時(shí)只鎖定必要的記錄妄壶。

?InnoDB多版本控制

InnoDB的一致性的非鎖定讀是通過MVCC實(shí)現(xiàn)的,Mysql的大多數(shù)事務(wù)型存儲(chǔ)引擎實(shí)現(xiàn)的都不是簡單的行級(jí)鎖寄狼《〖模基于提升并發(fā)性能的考慮,它們一般都同時(shí)實(shí)現(xiàn)了多版本并發(fā)控制(MVCC)泊愧。MVCC的實(shí)現(xiàn)伊磺,是通過保存數(shù)據(jù)在某一個(gè)時(shí)間點(diǎn)的快照來實(shí)現(xiàn)的。因此每一個(gè)事務(wù)無論執(zhí)行多長時(shí)間看到的數(shù)據(jù)删咱,都是一樣的屑埋。

快照讀

select語句默認(rèn),不加鎖痰滋,MVCC實(shí)現(xiàn)可重復(fù)讀摘能,使用的是MVCC機(jī)制讀取undo中的已經(jīng)提交的數(shù)據(jù)续崖。所以它的讀取是非阻塞的

當(dāng)前讀:select語句加S鎖或X鎖;所有的修改操作加X鎖团搞,在select for update 的時(shí)候袜刷,才是當(dāng)?shù)厍白x。

RR隔離級(jí)別下的快照讀莺丑,不是以begin開始的時(shí)間點(diǎn)作為snapshot建立時(shí)間點(diǎn)著蟹,而是以第一條select語句的時(shí)間點(diǎn)作為snapshot建立的時(shí)間點(diǎn)。

innodb中MVCC實(shí)現(xiàn)原理

InnoDB是一個(gè)?多版本的存儲(chǔ)引擎:它保存有關(guān)已更改行的舊版本的信息梢莽,以支持并發(fā)和回滾等事務(wù)功能?萧豆。此信息存儲(chǔ)在表空間中稱為?回滾段的數(shù)據(jù)結(jié)構(gòu)中(在Oracle中的類似數(shù)據(jù)結(jié)構(gòu)之后)。InnoDB?使用回滾段中的信息來執(zhí)行事務(wù)回滾中所需的撤消操作昏名。它還使用該信息構(gòu)建行的早期版本以進(jìn)行?一致讀取涮雷。參見文檔

在介紹MVCC實(shí)現(xiàn)原理之前首先普及一下,innodb會(huì)為我們建的每一張表添加三個(gè)隱藏列,具體如下。參見官方文檔.

db_row_id:行ID轻局,用來生成默認(rèn)聚簇索引(聚簇索引洪鸭,保存的數(shù)據(jù)在物理磁盤中按順序保存,這樣相關(guān)數(shù)據(jù)保存在一起仑扑,提高查詢速度).此外览爵,刪除在innodb內(nèi)部被視為更新,innodb會(huì)把行中的特殊位設(shè)置標(biāo)記為已刪除镇饮。

db_trx_id:事務(wù)ID蜓竹,新開始一個(gè)事務(wù)時(shí)生成,實(shí)例內(nèi)全局唯一

db_roll_ptr:undo log指針储藐,指向?qū)?yīng)記錄當(dāng)前的undo log

innodb的MVCC就是借助db_roll_ptr,db_trx_id和刪除標(biāo)記實(shí)現(xiàn)的.innodb將多個(gè)版本的數(shù)據(jù)存放在undo日志中.結(jié)構(gòu)如下


mvcc的操作方式

insert

當(dāng)我們向數(shù)據(jù)庫中插入一條數(shù)據(jù)時(shí)innodb會(huì)為這一行數(shù)據(jù)加上一個(gè)版本號(hào),這個(gè)版本號(hào)記錄的就是當(dāng)前事務(wù)的ID.具體做法是將當(dāng)前事務(wù)ID寫入db_trx_id俱济,將 db_roll_ptr設(shè)置為空

delete

當(dāng)我們刪除一條數(shù)據(jù)時(shí)在innodb中會(huì)被視為對(duì)數(shù)據(jù)的更新,innodb會(huì)先去比較db_trx_id與當(dāng)前事務(wù)ID的大小關(guān)系,如果db_trx_id<=當(dāng)前事務(wù)ID則可以刪除.在innodb執(zhí)行刪除操作的時(shí)候innodb將db_trx_id的值改為當(dāng)前事務(wù)的ID并對(duì)刪除標(biāo)志位進(jìn)行設(shè)置.同時(shí)將undo log指針寫入db_roll_ptr

update

對(duì)于update操作innodb將update操作轉(zhuǎn)化為delete和insert操作.具體過程如上.

select

當(dāng)我們要從數(shù)據(jù)庫中查詢一條數(shù)據(jù)的時(shí)候,innodb會(huì)取出滿足查詢條件的并且db_trx_id<當(dāng)前事物ID的數(shù)據(jù).

MVCC實(shí)現(xiàn)可重復(fù)讀

可重復(fù)讀(RR):在一個(gè)事務(wù)內(nèi)同一快照讀執(zhí)行任意次數(shù),得到的數(shù)據(jù)一致钙勃;且只能讀到第一次執(zhí)行前已經(jīng)提交的數(shù)據(jù)或本事務(wù)內(nèi)更改的數(shù)據(jù)

原理:對(duì)符合查詢條件的記錄進(jìn)行可見性判斷(上文的select操作方式)

缺點(diǎn): 可能出現(xiàn)幻讀

注意:MVCC 只對(duì)事務(wù)隔離級(jí)別RC,RR有效.


聲明:文章相關(guān)內(nèi)容借鑒自http://www.reibang.com/p/0ef46997c300

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蛛碌,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子辖源,更是在濱河造成了極大的恐慌蔚携,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件同木,死亡現(xiàn)場離奇詭異浮梢,居然都是意外死亡跛十,警方通過查閱死者的電腦和手機(jī)彤路,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芥映,“玉大人洲尊,你說我怎么就攤上這事远豺。” “怎么了坞嘀?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵躯护,是天一觀的道長。 經(jīng)常有香客問我丽涩,道長棺滞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任矢渊,我火速辦了婚禮继准,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘矮男。我一直安慰自己移必,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布毡鉴。 她就那樣靜靜地躺著崔泵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪猪瞬。 梳的紋絲不亂的頭發(fā)上憎瘸,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音陈瘦,去河邊找鬼含思。 笑死,一個(gè)胖子當(dāng)著我的面吹牛甘晤,可吹牛的內(nèi)容都是我干的含潘。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼线婚,長吁一口氣:“原來是場噩夢啊……” “哼遏弱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起塞弊,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤漱逸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后游沿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饰抒,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年诀黍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了袋坑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡眯勾,死狀恐怖枣宫,靈堂內(nèi)的尸體忽然破棺而出婆誓,到底是詐尸還是另有隱情,我是刑警寧澤也颤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布洋幻,位于F島的核電站,受9級(jí)特大地震影響翅娶,放射性物質(zhì)發(fā)生泄漏文留。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一竭沫、第九天 我趴在偏房一處隱蔽的房頂上張望厂庇。 院中可真熱鬧,春花似錦输吏、人聲如沸权旷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拄氯。三九已至,卻和暖如春它浅,著一層夾襖步出監(jiān)牢的瞬間译柏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國打工姐霍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鄙麦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓镊折,卻偏偏與公主長得像胯府,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子恨胚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

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