Mysql中MVCC的使用及原理詳解

準(zhǔn)備

測試環(huán)境:Mysql 5.7.20-log

數(shù)據(jù)庫默認隔離級別:RR(Repeatable Read掌实,可重復(fù)讀)爪瓜,MVCC主要適用于Mysql的RC,RR隔離級別

創(chuàng)建一張存儲引擎為testmvcc的表路星,sql為:

CREATE TABLE testmvcc (
 id int(11) DEFAULT NULL,
 name varchar(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

什么是MVCC?

英文全稱為Multi-Version Concurrency Control,翻譯為中文即 多版本并發(fā)控制。在小編看來赞哗,他無非就是樂觀鎖的一種實現(xiàn)方式牌里。在Java編程中融柬,如果把樂觀鎖看成一個接口死嗦,MVCC便是這個接口的一個實現(xiàn)類而已。

Mysql中MVCC的使用及原理詳解

特點

1.MVCC其實廣泛應(yīng)用于數(shù)據(jù)庫技術(shù)粒氧,像Oracle,PostgreSQL等也引入了該技術(shù)越除,即適用范圍廣

2.MVCC并沒有簡單的使用數(shù)據(jù)庫的行鎖,而是使用了行級鎖外盯,row_level_lock,而非InnoDB中的innodb_row_lock.

基本原理

MVCC的實現(xiàn)摘盆,通過保存數(shù)據(jù)在某個時間點的快照來實現(xiàn)的。這意味著一個事務(wù)無論運行多長時間饱苟,在同一個事務(wù)里能夠看到數(shù)據(jù)一致的視圖孩擂。根據(jù)事務(wù)開始的時間不同,同時也意味著在同一個時刻不同事務(wù)看到的相同表里的數(shù)據(jù)可能是不同的箱熬。

基本特征

  • 每行數(shù)據(jù)都存在一個版本类垦,每次數(shù)據(jù)更新時都更新該版本。
  • 修改時Copy出當(dāng)前版本隨意修改坦弟,各個事務(wù)之間無干擾护锤。
  • 保存時比較版本號,如果成功(commit)酿傍,則覆蓋原記錄烙懦;失敗則放棄copy(rollback)

InnoDB存儲引擎MVCC的實現(xiàn)策略

在每一行數(shù)據(jù)中額外保存兩個隱藏的列:當(dāng)前行創(chuàng)建時的版本號和刪除時的版本號(可能為空,其實還有一列稱為回滾指針赤炒,用于事務(wù)回滾氯析,不在本文范疇)。這里的版本號并不是實際的時間值莺褒,而是系統(tǒng)版本號掩缓。每開始新的事務(wù),系統(tǒng)版本號都會自動遞增遵岩。事務(wù)開始時刻的系統(tǒng)版本號會作為事務(wù)的版本號你辣,用來和查詢每行記錄的版本號進行比較。

每個事務(wù)又有自己的版本號尘执,這樣事務(wù)內(nèi)執(zhí)行CRUD操作時舍哄,就通過版本號的比較來達到數(shù)據(jù)版本控制的目的。

MVCC下InnoDB的增刪查改是怎么work的

1.插入數(shù)據(jù)(insert):記錄的版本號即當(dāng)前事務(wù)的版本號

執(zhí)行一條數(shù)據(jù)語句:insert into testmvcc values(1,"test");

假設(shè)事務(wù)id為1誊锭,那么插入后的數(shù)據(jù)行如下:

Mysql中MVCC的使用及原理詳解

2表悬、在更新操作的時候,采用的是先標(biāo)記舊的那行記錄為已刪除丧靡,并且刪除版本號是事務(wù)版本號蟆沫,然后插入一行新的記錄的方式籽暇。

比如,針對上面那行記錄饭庞,事務(wù)Id為2 要把name字段更新

update table set name= 'new_value' where id=1;

Mysql中MVCC的使用及原理詳解

3戒悠、刪除操作的時候,就把事務(wù)版本號作為刪除版本號但绕。比如

delete from table where id=1;

Mysql中MVCC的使用及原理詳解

4救崔、查詢操作:

從上面的描述可以看到惶看,在查詢時要符合以下兩個條件的記錄才能被事務(wù)查詢出來:

  1. 刪除版本號未指定或者大于當(dāng)前事務(wù)版本號捏顺,即查詢事務(wù)開啟后確保讀取的行未被刪除。(即上述事務(wù)id為2的事務(wù)查詢時纬黎,依然能讀取到事務(wù)id為3所刪除的數(shù)據(jù)行)

  2. 創(chuàng)建版本號 小于或者等于 當(dāng)前事務(wù)版本號 幅骄,就是說記錄創(chuàng)建是在當(dāng)前事務(wù)中(等于的情況)或者在當(dāng)前事務(wù)啟動之前的其他事物進行的insert。

(即事務(wù)id為2的事務(wù)只能讀取到create version<=2的已提交的事務(wù)的數(shù)據(jù)集)

補充:

1.MVCC手段只適用于Msyql隔離級別中的讀已提交(Read committed)和可重復(fù)讀(Repeatable Read).

2.Read uncimmitted由于存在臟讀本今,即能讀到未提交事務(wù)的數(shù)據(jù)行拆座,所以不適用MVCC.

原因是MVCC的創(chuàng)建版本和刪除版本只要在事務(wù)提交后才會產(chǎn)生。

3.串行化由于是會對所涉及到的表加鎖冠息,并非行鎖挪凑,自然也就不存在行的版本控制問題。

4.通過以上總結(jié)逛艰,可知躏碳,MVCC主要作用于事務(wù)性的,有行鎖控制的數(shù)據(jù)庫模型散怖。

關(guān)于Mysql中MVCC的總結(jié)

客觀上菇绵,我們認為他就是樂觀鎖的一整實現(xiàn)方式,就是每行都有版本號镇眷,保存時根據(jù)版本號決定是否成功咬最。

但由于Mysql的寫操作會加排他鎖(前文有講),如果鎖定了還算不算是MVCC欠动?

了解樂觀鎖的小伙伴們永乌,都知道其主要依靠版本控制,即消除鎖定具伍,二者相互矛盾翅雏,so從某種意義上來說,Mysql的MVCC并非真正的MVCC沿猜,他只是借用MVCC的名號實現(xiàn)了讀的非阻塞而已枚荣。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市啼肩,隨后出現(xiàn)的幾起案子橄妆,更是在濱河造成了極大的恐慌衙伶,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件害碾,死亡現(xiàn)場離奇詭異矢劲,居然都是意外死亡,警方通過查閱死者的電腦和手機慌随,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門芬沉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人阁猜,你說我怎么就攤上這事丸逸。” “怎么了剃袍?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵黄刚,是天一觀的道長。 經(jīng)常有香客問我民效,道長憔维,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任畏邢,我火速辦了婚禮业扒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘舒萎。我一直安慰自己程储,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布逆甜。 她就那樣靜靜地躺著虱肄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪交煞。 梳的紋絲不亂的頭發(fā)上咏窿,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天,我揣著相機與錄音素征,去河邊找鬼集嵌。 笑死,一個胖子當(dāng)著我的面吹牛御毅,可吹牛的內(nèi)容都是我干的根欧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼端蛆,長吁一口氣:“原來是場噩夢啊……” “哼凤粗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起今豆,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嫌拣,失蹤者是張志新(化名)和其女友劉穎柔袁,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體异逐,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡捶索,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了灰瞻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腥例。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖酝润,靈堂內(nèi)的尸體忽然破棺而出燎竖,到底是詐尸還是另有隱情,我是刑警寧澤袍祖,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布底瓣,位于F島的核電站,受9級特大地震影響蕉陋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拨扶,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一凳鬓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧患民,春花似錦缩举、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至印蓖,卻和暖如春辽慕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赦肃。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工溅蛉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人他宛。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓船侧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親厅各。 傳聞我的和親對象是個殘疾皇子镜撩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,974評論 2 355

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

  • 什么是事務(wù) 事務(wù)是一條或多條數(shù)據(jù)庫操作語句的組合,具備ACID队塘,4個特點袁梗。 原子性:要不全部成功卫旱,要不全部撤銷 隔...
    jiangmo閱讀 1,087評論 0 3
  • 為了充分發(fā)揮MySQL的性能并順利地使用,就必須理解其設(shè)計围段。MySQL的靈活性體現(xiàn)在很多方面顾翼。例如,你可以通過配置...
    李文文丶閱讀 1,174評論 0 4
  • 引言 數(shù)據(jù)庫鎖定機制簡單來說就是數(shù)據(jù)庫為了保證數(shù)據(jù)的一致性而使各種共享資源在被并發(fā)訪問變得有序所設(shè)計的一種規(guī)則;對...
    高級java架構(gòu)師閱讀 725評論 0 1
  • 索引 數(shù)據(jù)庫中的查詢操作非常普遍,索引就是提升查找速度的一種手段 索引的類型 從數(shù)據(jù)結(jié)構(gòu)角度分 1.B+索引:傳統(tǒng)...
    一凡呀閱讀 2,920評論 0 8
  • 今天哥哥和他的朋友吃飯冯遂,吃飯的時候蕊肥。媽媽和哥哥朋友的媽媽聊天。哥哥和哥哥的朋友聊天蛤肌。而我沒有人聊天壁却,還好...
    唐康凱閱讀 108評論 0 0