Mysql基礎知識《六》

再話可重復讀事務

在之前我們說到了可重復讀事務,由MVCC多版本控制來實現(xiàn)呛每,接下來我們再來探討一下事務的可重復讀是怎么實現(xiàn)的踩窖。
強調(diào):

  1. 在RR事務開啟的時候,有begin/start transaction 啟動的事務是在第一次查詢的時候創(chuàng)建一致性視圖晨横。當我們用start transaction with cinsistent snapshot語句的時候?qū)谑聞臻_啟的時候創(chuàng)建一致性視圖洋腮。
  2. 一致性視圖并不會拷貝數(shù)據(jù)庫的全部數(shù)據(jù)箫柳,因為有每一行都有它的版本號,事務開啟的時候可會有一個遞增的版本號啥供,在之前我們提到悯恍,當事務修改行數(shù)據(jù)的時候,會有一個undo log記錄當前數(shù)據(jù)伙狐,并且將事務的版本號賦給行版本涮毫。當我們需要計算出事務可見的狀態(tài)的時候,就是通過undo log來推算出來的贷屎。innodb利用數(shù)據(jù)的多版本特性快速的創(chuàng)建了一致性視圖罢防。
  3. 當事務開始的時候,會創(chuàng)建一個事務數(shù)組用來保存已經(jīng)啟動但是還沒有提交的活躍事務id豫尽,視圖數(shù)組中的最小id稱之為低水位線篙梢,最大的事務id+1稱之為高水位線。
image.png

從圖中可以看到美旧,第一個有效更新是事務 C渤滞,把數(shù)據(jù)從 (1,1) 改成了 (1,2)。這時候榴嗅,這個
數(shù)據(jù)的最新版本的 row trx_id 是 102妄呕,而 90 這個版本已經(jīng)成為了歷史版本。
第二個有效更新是事務 B嗽测,把數(shù)據(jù)從 (1,2) 改成了 (1,3)绪励。這時候,這個數(shù)據(jù)的最新版本(即
row trx_id)是 101唠粥,而 102 又成為了歷史版本疏魏。
你可能注意到了,在事務 A 查詢的時候晤愧,其實事務 B 還沒有提交大莫,但是它生成的 (1,3) 這
個版本已經(jīng)變成當前版本了。但這個版本對事務 A 必須是不可見的官份,否則就變成臟讀了只厘。
好,現(xiàn)在事務 A 要來讀數(shù)據(jù)了舅巷,它的視圖數(shù)組是 [99,100]羔味。當然了,讀數(shù)據(jù)都是從當前版
本讀起的钠右。所以赋元,事務 A 查詢語句的讀數(shù)據(jù)流程是這樣的:
這樣執(zhí)行下來,雖然期間這一行數(shù)據(jù)被修改過,但是事務 A 不論在什么時候查詢们陆,看到這
行數(shù)據(jù)的結(jié)果都是一致的寒瓦,所以我們稱之為一致性讀。
這個判斷規(guī)則是從代碼邏輯直接轉(zhuǎn)譯過來的坪仇,但是正如你所見杂腰,用于人肉分析可見性很麻
煩。
所以椅文,我來給你翻譯一下喂很。一個數(shù)據(jù)版本,對于一個事務視圖來說皆刺,除了自己的更新總是可
見以外少辣,有三種情況:

  1. 版本未提交,不可見羡蛾;
  2. 版本已提交漓帅,但是是在視圖創(chuàng)建后提交的,不可見痴怨;
  3. 版本已提交忙干,而且是在視圖創(chuàng)建前提交的,可見浪藻。

現(xiàn)在捐迫,我們用這個規(guī)則來判斷圖 4 中的查詢結(jié)果,事務 A 的查詢語句的視圖數(shù)組是在事務A 啟動的時候生成的爱葵,這時候:找到 (1,3) 的時候施戴,判斷出 row trx_id=101,比高水位大萌丈,處于紅色區(qū)域赞哗,不可見;接著辆雾,找到上一個歷史版本懈玻,一看 row trx_id=102,比高水位大乾颁,處于紅色區(qū)域,不可見艺栈;再往前找英岭,終于找到了(1,1),它的 row trx_id=90湿右,比低水位小诅妹,處于綠色區(qū)域,可見。你看吭狡,去掉數(shù)字對比后尖殃,只用時間先后順序來判斷,分析起來是不是輕松多了划煮。所以送丰,后面我們就都用這個規(guī)則來分析。

更新邏輯

前面說的一致性讀并不對更新語句有效弛秋,當事務中的更新語句是器躏,其看到的數(shù)據(jù)必須是當前的最新值,不然其他事務的操作就會被掩蓋掉蟹略。更新數(shù)據(jù)的時候都是先讀后寫的登失,這個都就是當前讀。除了update語句挖炬,我們也可以讓select語句變成當前讀揽浙。

select * from t where id=1 for update//寫鎖
select * from t where id =1 lock in share mode//讀鎖

一致性視圖

在mysql中利用一致性視圖來實現(xiàn)可重復讀和讀提交。對于讀提交意敛,每次查詢操作都會更新視圖數(shù)組馅巷。

事務的可重復讀是怎么實現(xiàn)的?

事務的可重復讀的核心是一致性讀空闲,一致性讀是通過創(chuàng)建一致性視圖和MVCC來實現(xiàn)的令杈,而對于更新操作,只能用當前讀碴倾。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末逗噩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子跌榔,更是在濱河造成了極大的恐慌异雁,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件僧须,死亡現(xiàn)場離奇詭異纲刀,居然都是意外死亡,警方通過查閱死者的電腦和手機担平,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門示绊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人暂论,你說我怎么就攤上這事面褐。” “怎么了取胎?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵展哭,是天一觀的道長湃窍。 經(jīng)常有香客問我,道長匪傍,這世上最難降的妖魔是什么您市? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮役衡,結(jié)果婚禮上茵休,老公的妹妹穿的比我還像新娘。我一直安慰自己映挂,他們只是感情好泽篮,可當我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著柑船,像睡著了一般帽撑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鞍时,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天亏拉,我揣著相機與錄音,去河邊找鬼逆巍。 笑死及塘,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的锐极。 我是一名探鬼主播笙僚,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼灵再!你這毒婦竟也來了肋层?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤翎迁,失蹤者是張志新(化名)和其女友劉穎栋猖,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體汪榔,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡蒲拉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了痴腌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雌团。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖士聪,靈堂內(nèi)的尸體忽然破棺而出辱姨,到底是詐尸還是另有隱情,我是刑警寧澤戚嗅,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響懦胞,放射性物質(zhì)發(fā)生泄漏替久。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一躏尉、第九天 我趴在偏房一處隱蔽的房頂上張望蚯根。 院中可真熱鬧,春花似錦胀糜、人聲如沸颅拦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽距帅。三九已至,卻和暖如春括堤,著一層夾襖步出監(jiān)牢的瞬間碌秸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工悄窃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留讥电,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓轧抗,卻偏偏與公主長得像恩敌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子横媚,可洞房花燭夜當晚...
    茶點故事閱讀 43,492評論 2 348

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