mysql數據mvcc版本控制原理

事務并發(fā)執(zhí)行遇到的問題

  1. 臟讀(未提交讀)
  2. 不可重復讀(已提交讀)
  3. 幻讀(讀出新紀錄)

事務隔離級別

隔離級別 臟讀 不可重復讀 幻讀
未提交讀 可能 可能 可能
已提交讀 —— 可能 可能
可重復讀 —— —— ——
可串行化 —— —— ——

mysql在可重復讀的級別下,極大的程度上避免了幻讀厉萝。

版本鏈

對于InnoDB引擎來說柑营,每個主鍵索引記錄中包含了兩個隱藏列

隱藏列
trx_id 記錄當前正在操作此條記錄的事務id
roll_pointer 修改時囚痴,記錄舊的版本到undo日志中, 當前列就是指向舊版本的指針,以便找到修改前的信息

示例

  1. 創(chuàng)建一張表
CREATE TABLE teacher ( number INT,
name VARCHAR(100), domain varchar(100), PRIMARY KEY (number)
) Engine=InnoDB CHARSET=utf8;
  1. 新增一條記錄辽俗,并且當前插入的事物id為60
INSERT INTO teacher VALUES(1, 'Jack', '源碼系列');

此刻生成一條記錄深啤,如下圖所示

insert
  1. 之后有兩個80、120事務更新
trx_id(80) trx_id(120)
BEGIN
BEGIN
UPDATE teacher SET name = 'Mark' WHERE number = 1;
UPDATE teacher SET name = 'James' WHERE number = 1;
COMMIT
UPDATE teacher SET name = 'King' WHERE number = 1;
UPDATE teacher SET name = '大飛' WHERE number = 1;
COMMIT

每次記錄修改都有一條undo日志汛骂,每條undo日志都會一個roll_pointer屬性罕模。可以將這些undo日志串成鏈表帘瞭,我們把這種鏈表稱為版本鏈淑掌。

msyql版本鏈

對該記錄每次更新后,都會將舊值放到一條 undo 日志中蝶念,就算是該記錄的 一個舊版本抛腕,隨著更新次數的增多,所有的版本都會被 roll_pointer 屬性連接成 一個鏈表媒殉,我們把這個鏈表稱之為版本鏈

ReadView

InnoDB 提出了一個 ReadView 的概念兽埃, 包含 4 個比較重要的內容:

id 說明
m_ids 生成 ReadView 時當前系統(tǒng)中活躍的讀寫事務的事務 id 列表
min_trx_id 生成 ReadView 時當前系統(tǒng)中活躍的讀寫事務中最小的事務 id,也就是 m_ids 中的最小值适袜。
max_trx_id 生成 ReadView 時系統(tǒng)中應該分配給下一個事務的 id 值
creator_trx_id 生成該 ReadView 的事務的事務 id

訪問某條記錄時柄错,使用ReadView,遍歷版本鏈苦酱,通過下面規(guī)則判斷某個節(jié)點數據是否可以訪問售貌。

  1. 如果被訪問的 trx_id 屬性值與 ReadView 中的 creator_trx_id 值相同, 意味著當前事務在訪問它自己修改過的記錄疫萤,所以該版本可以被當前事務訪問颂跨。
  2. 如果被訪問版本的 trx_id 屬性值小于 ReadView 中的 min_trx_id 值,表明 生成該版本的事務在當前事務生成 ReadView 前已經提交扯饶,所以該版本可以被當 前事務訪問恒削。
  3. 如果被訪問版本的 trx_id 屬性值大于或等于 ReadView 中的 max_trx_id 值,表明生成該版本的事務在當前事務生成 ReadView 后才開啟尾序,所以該版本不 可以被當前事務訪問钓丰。
  4. 如果被訪問版本的 trx_id 屬性值在 ReadView 的 min_trx_id 和 max_trx_id 之間(min_trx_id <= trx_id < max_trx_id),那就需要判斷一下 trx_id 屬性值是不是在 m_ids 列表中每币,如果在携丁,說明創(chuàng)建 ReadView 時生成該版本的事務還是活躍的, 該版本不可以被訪問;如果不在兰怠,說明創(chuàng)建 ReadView 時生成該版本的事務已經 被提交梦鉴,該版本可以被訪問李茫。
  5. 如果某個版本的數據對當前事務不可見的話,那就順著版本鏈找到下一 個版本的數據肥橙,繼續(xù)按照上邊的步驟判斷可見性魄宏,依此類推,直到版本鏈中的最 后一個版本存筏。如果最后一個版本也不可見的話娜庇,那么就意味著該條記錄對該事務 完全不可見,查詢結果就不包含該記錄方篮。

在 MySQL 中名秀,已提交讀(RC)和可重復讀(RR)隔離級別的的一個非 常大的區(qū)別就是它們生成 ReadView 的時機不同。

  1. 已提交讀(RC)在每次讀取數據前都生成一個 ReadView藕溅。
  2. 可重復讀(RR)在第一次讀取數據時生成一個 ReadView匕得。

mysql默認的事務隔離級別是可重復讀(RC)

mysql可重復讀(RR)基本解決了幻讀問題,那什么情況下會出現幻讀問題呢巾表。

  1. 假設有T1汁掠,T2,兩個事務集币,T1先開啟事務考阱。
  2. T2插入一條記錄,并提交事務
  3. T1查詢T2插入的記錄鞠苟,很明顯查詢不到乞榨。
  4. 如果此刻T1更新了T2插入的那條記錄
  5. 此刻T1再去查詢那條記錄,這時是可以查到的当娱,這就是幻讀

這種情況在實際生產并不多吃既。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市跨细,隨后出現的幾起案子鹦倚,更是在濱河造成了極大的恐慌,老刑警劉巖冀惭,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件震叙,死亡現場離奇詭異,居然都是意外死亡散休,警方通過查閱死者的電腦和手機媒楼,發(fā)現死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門喘蟆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來慢哈,“玉大人,你說我怎么就攤上這事煞烫』璧危” “怎么了猴鲫?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長谣殊。 經常有香客問我拂共,道長,這世上最難降的妖魔是什么姻几? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任宜狐,我火速辦了婚禮,結果婚禮上蛇捌,老公的妹妹穿的比我還像新娘抚恒。我一直安慰自己,他們只是感情好络拌,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布俭驮。 她就那樣靜靜地躺著,像睡著了一般春贸。 火紅的嫁衣襯著肌膚如雪混萝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天萍恕,我揣著相機與錄音逸嘀,去河邊找鬼。 笑死允粤,一個胖子當著我的面吹牛崭倘,可吹牛的內容都是我干的。 我是一名探鬼主播类垫,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼绳姨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了阔挠?” 一聲冷哼從身側響起飘庄,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎购撼,沒想到半個月后跪削,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡迂求,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年碾盐,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片揩局。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡毫玖,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情付枫,我是刑警寧澤烹玉,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站阐滩,受9級特大地震影響二打,放射性物質發(fā)生泄漏。R本人自食惡果不足惜掂榔,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一继效、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧装获,春花似錦瑞信、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绩郎,卻和暖如春潘鲫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肋杖。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工溉仑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人状植。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓浊竟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親津畸。 傳聞我的和親對象是個殘疾皇子振定,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內容