Mysql的隔離級別

總結(jié)

  1. 四種隔離級別:
    讀未提交(read uncommitted)RU:數(shù)據(jù)會讀取其他事務(wù)未更新到數(shù)據(jù)的數(shù)據(jù)阁危∪焖觯可能會存在臟讀、不可重復(fù)讀识啦、幻讀的問題。
    讀已提交(read committed)RC:數(shù)據(jù)只能讀取其他事務(wù)提交的數(shù)據(jù)神妹,不存在臟讀颓哮,但是可能會存在不可重復(fù)讀、幻讀的問題鸵荠。
    可重復(fù)讀(repeatable read)RR:事務(wù)執(zhí)行過程中看到的數(shù)據(jù)冕茅,總是和這個事務(wù)開啟時看到的數(shù)據(jù)是一致的。在可重復(fù)讀的隔離級別下,未提交的事務(wù)對其他事務(wù)也是不可見的姨伤。不存在臟讀哨坪、不可重復(fù)讀,但是可能會存在幻讀問題姜挺。
    串行化(serializable)S:存在讀寫鎖沖突時齿税,后訪問的事務(wù)會等前一個事務(wù)執(zhí)行完畢后,再繼續(xù)執(zhí)行炊豪。
  2. MySQL采用了MVVC(多版本并發(fā)控制)解決讀已提交凌箕、可重復(fù)讀隔離問題。
    執(zhí)行一條SQL語句词渤,都會保存兩個隱藏的列牵舱。一個是保存創(chuàng)建版本,一個保存過期版本缺虐,儲存的系統(tǒng)版本號芜壁。
    每次開啟一個事務(wù)都會系統(tǒng)會遞增一個系統(tǒng)版本號,作為事務(wù)的版本號。
    select高氮,查詢早于當前事務(wù)的數(shù)據(jù)慧妄。
    insert,添加版本號剪芍。
    delete塞淹,為刪除的行把版本號作為刪除標識。
    update罪裹,先插入一條數(shù)據(jù)饱普,保存當前系統(tǒng)版本號,同時保存原來的行作為行刪除標志状共。

前言

一個事務(wù)具有ACID特性套耕,也就是(Atomicity、Consistency峡继、Isolation冯袍、Durability,即原子性碾牌、一致性颠猴、隔離性、持久性)小染,本文主要講解一下其中的Isolation翘瓮,也就是事務(wù)的隔離性。

隔離性

四種級別

  1. 讀未提交(read uncommitted)RU
    一個事務(wù)還沒提交時裤翩,它修改的數(shù)據(jù)都可以被別的事物看到资盅。
  2. 讀已提交(read committed)RC
    一個事務(wù)提交之后调榄,它修改的數(shù)據(jù)才會被別的事物看到。
  3. 可重復(fù)讀(repeatable read)RR
    一個事務(wù)執(zhí)行過程中看到的數(shù)據(jù)呵扛,總是和這個事務(wù)開啟時看到的數(shù)據(jù)是一致的每庆。在可重復(fù)讀的隔離級別下,未提交的事務(wù)對其他事務(wù)也是不可見的今穿。
  4. 串行化(serializable)S
    數(shù)據(jù)的讀和寫都會加鎖缤灵,讀會加讀鎖,寫會加寫鎖蓝晒。當遇到讀寫鎖沖突時腮出,后訪問的事務(wù)必須等前一個事務(wù)執(zhí)行完成后,再繼續(xù)執(zhí)行芝薇。

以上四種隔離級別胚嘲,由上往下隔離強度越來越大,但是執(zhí)行效率會隨之降低洛二。在設(shè)置隔離級別時候馋劈,需要在隔離級別和執(zhí)行效率兩者做平衡取舍。

eg:


image.png

在不同隔離級別下晾嘶,事務(wù)A會有哪些不同的返回結(jié)果妓雾,也就是圖中的V1、V2垒迂、V3的返回值分別是什么械姻。

  • 如果隔離級別是讀未提交,事務(wù)B修改后數(shù)據(jù)無需提交事務(wù)娇斑,就能被事務(wù)A讀取策添,所以V1材部、V2毫缆、V3的值都是2。
  • 如果隔離級別是讀已提交乐导,事務(wù)B修改后需要提交后苦丁,修改后的數(shù)據(jù)才能被事務(wù)A讀取,所以V1的值是1物臂,事務(wù)B提交旺拉,事務(wù)A讀取修改后的數(shù)據(jù),所以V2的值是2,V3的值也是2。
  • 如果隔離級別是可重復(fù)讀棵磷,整個事務(wù)看到的事務(wù)和事務(wù)開啟時看到的數(shù)據(jù)是一致的蛾狗,開啟看到的數(shù)據(jù)是1,所以V1仪媒、V2的值都是1,事務(wù)A提交之后沉桌,獲取到修改后的數(shù)據(jù),所以V3的值是2。
  • 如果隔離級別是串行化留凭,會被鎖住佃扼,此時事務(wù)B對應(yīng)的線程處于阻塞狀態(tài),直到事務(wù)A提交之后蔼夜,事務(wù)B才會繼續(xù)將1改成2兼耀。所以V1、V2的值是1求冷,V3的值是2瘤运。

MySQL默認的隔離級別是可重復(fù)讀。

數(shù)據(jù)不一致現(xiàn)象

三種現(xiàn)象

  1. 臟讀
    事務(wù)A修改數(shù)據(jù)遵倦,事務(wù)B讀取了數(shù)據(jù)后事務(wù)A報錯回滾尽超,修改的數(shù)據(jù)沒有提交到數(shù)據(jù)庫中,此時事務(wù)B讀取修改的數(shù)據(jù)就是一個臟讀梧躺,也就是一個事務(wù)讀取到另一個事務(wù)未提交的數(shù)據(jù)就是臟讀似谁。
  2. 不可重復(fù)讀
    事務(wù)A在同一個事務(wù)上多次讀取同一個數(shù)據(jù),在事務(wù)A還沒有結(jié)束時掠哥,事務(wù)B修改了該數(shù)據(jù)巩踏,由于事務(wù)B的修改,導(dǎo)致事務(wù)A兩次讀取的數(shù)據(jù)不一致续搀,就出現(xiàn)了不可以重復(fù)讀的現(xiàn)象塞琼。
  3. 幻讀
    事務(wù)A根據(jù)條件查詢得到N條數(shù)據(jù),但此時事務(wù)B更改或者增加了M條符合事務(wù)A查詢的條件的數(shù)據(jù)禁舷。這樣當事務(wù)A再次查詢的時候發(fā)現(xiàn)會有N + M條數(shù)據(jù)彪杉,產(chǎn)生了幻讀。

四種隔離級別對應(yīng)可以解決什么不一致現(xiàn)象:

  • 讀未提交(read uncommitted)
    數(shù)據(jù)會讀取其他事務(wù)未更新到數(shù)據(jù)的數(shù)據(jù)牵咙∨山可能會存在臟讀、不可重復(fù)讀洁桌、幻讀的問題渴丸。
  • 讀已提交(read committed)
    數(shù)據(jù)只能讀取其他事務(wù)提交的數(shù)據(jù),不存在臟讀另凌,但是可能會存在不可重復(fù)讀谱轨、幻讀的問題。
  • 可重復(fù)讀(repeatable read)
    事務(wù)執(zhí)行過程中看到的數(shù)據(jù)吠谢,總是和這個事務(wù)開啟時看到的數(shù)據(jù)是一致的土童。在可重復(fù)讀的隔離級別下,未提交的事務(wù)對其他事務(wù)也是不可見的工坊。不存在臟讀献汗、不可重復(fù)讀错沃,但是可能會存在幻讀問題。
  • 串行化(serializable)
    存在讀寫鎖沖突時雀瓢,后訪問的事務(wù)會等前一個事務(wù)執(zhí)行完畢后枢析,再繼續(xù)執(zhí)行。

隔離級別原理

隔離級別的主要是多版本并發(fā)控制MVCC,MVCC是通過保存數(shù)據(jù)在某個時間點的快照來實現(xiàn)的刃麸。

InnoDB實現(xiàn)的MVCC醒叁,是通過在每行記錄后面保存兩個隱藏列來實現(xiàn),一個是保存行的創(chuàng)建時間泊业,另一個是保存行的過期時間把沼。當然存儲的不是時間,而是系統(tǒng)版本號吁伺。每開啟一個新的事務(wù)饮睬,系統(tǒng)版本號先自動遞增,該系統(tǒng)版本號會作為事務(wù)的版本號篮奄,用來和查詢到的每行記錄的版本號做比較捆愁。

比如在可重復(fù)讀隔離級別下,MVCC是如何操作的:

SELECT

InnoDB會根據(jù)以下兩個條件檢查每行記錄:
只有符合上述兩個條件的記錄窟却,才能返回作為查詢的結(jié)果昼丑。

InnoDB只查找版本號早于當前事務(wù)的數(shù)據(jù)行(系統(tǒng)版本號小于或者等于事務(wù)的系統(tǒng)版本號),這樣可以確保事務(wù)讀取的行夸赫,要么是在事務(wù)開始前就存在菩帝,要么是事務(wù)自身插入或者更新過。

行的刪除版本要么未定義茬腿,要么大于當前事務(wù)版本號呼奢。這可以確保事務(wù)讀取到的行,在事務(wù)開始之前未被刪除切平。

INSERT

InnoDB為新插入的每一行保存當前系統(tǒng)版本號作為行版本號握础。

DELETE

InnoDB為刪除的每一行保存當前系統(tǒng)版本號作為行刪除的標識。

UPDATE

InnoDB為插入一行新記錄揭绑,保存當前系統(tǒng)版本號作為行版本號弓候,同時保存當前系統(tǒng)版本號到原來的行作為行刪除標識郎哭。

保存著兩個額外的系統(tǒng)版本號他匪,大多數(shù)讀操作都可以不用加鎖。這樣設(shè)計是的讀數(shù)據(jù)的操作很簡單夸研,性能很好邦蜜,并且也能保證只會讀取到符合標準的行。不足之處是每行記錄都需要額外的存儲空間亥至,需要做更多的行檢查工作悼沈,以及一些額外的維護工作贱迟。

MVCC只在讀已提交和可重復(fù)讀兩個隔離級別下生效。其他兩個隔離級別下MVCC都不能生效絮供,因為讀未提交總是讀取到最新的數(shù)據(jù)行衣吠,無需記錄當前事務(wù)版本號。而串行化會對所有的讀寫都會進行加鎖壤靶,先讀缚俏、先寫的先執(zhí)行,后讀贮乳、后寫的后執(zhí)行忧换。也不需要記錄記錄版本號精心比對。

InnoDB的行數(shù)據(jù)有多個版本向拆,每個數(shù)據(jù)版本都有自己的row trx_id亚茬,每個事務(wù)或者語句都有自己的一致性視圖。查詢語句是一致性讀浓恳,一致性讀會根據(jù)row trx_id和一致性視圖確定數(shù)據(jù)版本的可見性刹缝。

  • 可重復(fù)讀,只查詢事務(wù)啟動前所有事務(wù)提交完成的數(shù)據(jù)颈将。

  • 讀已提交赞草,只查詢語句啟動前(一個事務(wù)內(nèi)可以執(zhí)行多個語句)所有事務(wù)提交完成的數(shù)據(jù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吆鹤,一起剝皮案震驚了整個濱河市厨疙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疑务,老刑警劉巖沾凄,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異知允,居然都是意外死亡撒蟀,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門温鸽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來保屯,“玉大人,你說我怎么就攤上這事涤垫」贸撸” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵蝠猬,是天一觀的道長切蟋。 經(jīng)常有香客問我,道長榆芦,這世上最難降的妖魔是什么柄粹? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任喘鸟,我火速辦了婚禮,結(jié)果婚禮上驻右,老公的妹妹穿的比我還像新娘什黑。我一直安慰自己,他們只是感情好堪夭,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布兑凿。 她就那樣靜靜地躺著,像睡著了一般茵瘾。 火紅的嫁衣襯著肌膚如雪礼华。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天拗秘,我揣著相機與錄音圣絮,去河邊找鬼。 笑死雕旨,一個胖子當著我的面吹牛扮匠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凡涩,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼棒搜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了活箕?” 一聲冷哼從身側(cè)響起力麸,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎育韩,沒想到半個月后克蚂,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡筋讨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年埃叭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悉罕。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡赤屋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出壁袄,到底是詐尸還是另有隱情类早,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布然想,位于F島的核電站莺奔,受9級特大地震影響欣范,放射性物質(zhì)發(fā)生泄漏变泄。R本人自食惡果不足惜令哟,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望妨蛹。 院中可真熱鬧屏富,春花似錦、人聲如沸蛙卤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽颤难。三九已至神年,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間行嗤,已是汗流浹背已日。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留栅屏,地道東北人飘千。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像栈雳,于是被迫代替她去往敵國和親护奈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

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