MySQL 高頻面試題解析 第02期:當(dāng)前讀和快照讀的區(qū)別

作者簡介

無為懒鉴,多年 MySQL DBA 工作經(jīng)驗(yàn)爬虱,現(xiàn)就職于某知名互聯(lián)網(wǎng)公司拱燃,對(duì) MySQL秉溉、 Redis、PostgrepSQL 等主流數(shù)據(jù)庫有一定了解碗誉,擁有豐富的一線運(yùn)維經(jīng)驗(yàn)召嘶。

涉及到 MySQL 的面試時(shí),是不是經(jīng)常會(huì)被問到當(dāng)前讀和快照讀的區(qū)別哮缺?

本節(jié)內(nèi)容就來聊聊這個(gè)話題弄跌,首先從快照讀開始:

1 普通讀

1.1 定義

普通讀(也稱快照讀,英文名:Consistent Read)尝苇,就是單純的 SELECT 語句铛只,不包括下面這兩類語句:

SELECT ... FOR UPDATE

SELECT ... LOCK IN SHARE MODE

普通讀的執(zhí)行方式是生成 ReadView埠胖,直接利用 MVCC 機(jī)制來進(jìn)行讀取,并不會(huì)對(duì)記錄進(jìn)行加鎖格仲。

小貼士

對(duì)于 SERIALIZABLE 隔離級(jí)別來說押袍,如果 autocommit 系統(tǒng)變量被設(shè)置為OFF,那普通讀的語句會(huì)轉(zhuǎn)變?yōu)殒i定讀凯肋,和在普通的 SELECT 語句后邊加 LOCK IN SHARE MODE 達(dá)成的效果一樣谊惭。

1.2 實(shí)現(xiàn)方式

普通讀是通過 undo log + MVCC 來實(shí)現(xiàn)的,具體我們?cè)僮屑?xì)聊聊:

下圖右側(cè)黃色部分是數(shù)據(jù):一行數(shù)據(jù)記錄侮东,主鍵 ID 是 10圈盔,object = 'Goland' ?,被 update 更新為 object = 'Python' 悄雅。

事務(wù)會(huì)先使用“排他鎖”鎖定該行驱敲,將該行當(dāng)前的值復(fù)制到 undo log 中,然后再真正地修改當(dāng)前行的值宽闲,最后填寫事務(wù)的 DB_TRX_ID 众眨,使用回滾指針 DB_ROLL_PTR 指向 undo log 中修改前的行。

這里解釋一下DB_TRX_ID 和DB_ROLL_PTR 所代表的含義:

DB_TRX_ID?: ?6 字節(jié) DB_TRX_ID 字段容诬,表示最后更新的事務(wù) id ( update , delete , insert ) 娩梨。此外,刪除在內(nèi)部被視為更新览徒,其中行中的特殊位被設(shè)置為將其標(biāo)記為已軟刪除狈定。

DB_ROLL_PTR?: ?7 字節(jié)回滾指針,指向前一個(gè)版本的 undo log 記錄习蓬,組成 undo 鏈表纽什。如果更新了行,則撤消日志記錄包含在更新行之前重建行內(nèi)容所需的信息躲叼。

小貼士

insert undo log 只在事務(wù)回滾時(shí)需要, 事務(wù)提交就可以刪掉了芦缰。update undo log 包括 update 和 delete , 回滾和快照讀都需要。

2 當(dāng)前讀

聊完快照讀枫慷,再聊聊當(dāng)前讀(也稱鎖定讀饺藤,Locking Read)。

2.1 定義

當(dāng)前讀流礁,讀取的是最新版本涕俗,并且需要先獲取對(duì)應(yīng)記錄的鎖,如以下這些 SQL 類型:

select?...?lock?in?share?mode?神帅、

select?...?for?update再姑、

update?、delete 找御、insert

當(dāng)然元镀,獲取什么類型的鎖取決于當(dāng)前事務(wù)的隔離級(jí)別绍填、語句的執(zhí)行計(jì)劃、查詢條件等因素栖疑。例如讨永,要 update 一條記錄,在事務(wù)執(zhí)行過程中遇革,如果不加鎖卿闹,那么另一個(gè)事務(wù)可以 delete 這條數(shù)據(jù)并且能成功 commit ,就會(huì)產(chǎn)生沖突了萝快。所以 update 的時(shí)候肯定要是當(dāng)前讀锻霎,得到最新的信息并且鎖定相應(yīng)的記錄。

2.2 實(shí)現(xiàn)方式

當(dāng)前讀是通過 next-key 鎖(行記錄鎖+間隙鎖)來是實(shí)現(xiàn)的揪漩。

這里補(bǔ)充下行鎖的 3 種算法:

行鎖(Record Lock):鎖直接加在索引記錄上面旋恼。

間隙鎖(Gap Lock):是 Innodb 為了解決幻讀問題時(shí)引入的鎖機(jī)制,所以只有在 Read Repeatable 奄容、Serializable 隔離級(jí)別才有冰更。

Next-Key Lock :Record Lock + Gap Lock,鎖定一個(gè)范圍并且鎖定記錄本身 昂勒。

下面通過一個(gè)例子來說明當(dāng)前讀的實(shí)現(xiàn)方式蜀细,例如下面這條 SQL:

delete?from?T?where?age =?7;

進(jìn)行下面的實(shí)驗(yàn):

測(cè)試可知 delete from T where age = 7; 語句在 age 上的加鎖區(qū)間為 (4,10) ,圖解如下:

歡迎加入 MySQL 交流社群

群內(nèi)不定期邀請(qǐng)一些身邊的大牛

交流分享,解答工作中遇到的的問題

分享工作經(jīng)驗(yàn)叁怪、(微yzlkf09)面試技巧等审葬!

也歡迎各位大牛投稿深滚,內(nèi)容可以是數(shù)據(jù)庫奕谭、開發(fā)、運(yùn)維痴荐、產(chǎn)品血柳、運(yùn)營等!

悅專欄 LIKECOLUMN

在這里生兆,學(xué)好編程

做更優(yōu)秀的 IT人难捌!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鸦难,隨后出現(xiàn)的幾起案子根吁,更是在濱河造成了極大的恐慌,老刑警劉巖合蔽,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件击敌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡拴事,警方通過查閱死者的電腦和手機(jī)沃斤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門圣蝎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人衡瓶,你說我怎么就攤上這事徘公。” “怎么了哮针?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵关面,是天一觀的道長。 經(jīng)常有香客問我诚撵,道長缭裆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任寿烟,我火速辦了婚禮澈驼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘筛武。我一直安慰自己缝其,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布徘六。 她就那樣靜靜地躺著内边,像睡著了一般。 火紅的嫁衣襯著肌膚如雪待锈。 梳的紋絲不亂的頭發(fā)上漠其,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音竿音,去河邊找鬼和屎。 笑死,一個(gè)胖子當(dāng)著我的面吹牛春瞬,可吹牛的內(nèi)容都是我干的柴信。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼宽气,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼随常!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起萄涯,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤绪氛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后涝影,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體枣察,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年袄琳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了询件。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片燃乍。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖宛琅,靈堂內(nèi)的尸體忽然破棺而出刻蟹,到底是詐尸還是另有隱情,我是刑警寧澤嘿辟,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布舆瘪,位于F島的核電站,受9級(jí)特大地震影響红伦,放射性物質(zhì)發(fā)生泄漏英古。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一昙读、第九天 我趴在偏房一處隱蔽的房頂上張望召调。 院中可真熱鬧,春花似錦蛮浑、人聲如沸唠叛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽艺沼。三九已至,卻和暖如春蕴掏,著一層夾襖步出監(jiān)牢的瞬間障般,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工盛杰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挽荡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓饶唤,卻偏偏與公主長得像徐伐,于是被迫代替她去往敵國和親贯钩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子募狂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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