MySQL事務(wù)隔離級(jí)別

事務(wù)
一. 事務(wù)的特性(ACID)


image.png
  1. 原子性(Atomicity): 事務(wù)是最小的執(zhí)行單位吐根,不允許分割赔蒲。事務(wù)的原子性確保動(dòng)作要么全部完成忧额,要么全部失敗回滾厘肮;
    拿轉(zhuǎn)賬來說,假設(shè)用戶A給用戶B轉(zhuǎn)賬1000元睦番,那么A的余額減少1000类茂,B的余額增加1000耍属,如果一個(gè)出錯(cuò),所有都應(yīng)該失敗巩检。
  2. 一致性(Consistency): 執(zhí)行事務(wù)前后恬涧,數(shù)據(jù)保持一致,多個(gè)事務(wù)對(duì)同一個(gè)數(shù)據(jù)讀取的結(jié)果是相同的碴巾;
    拿轉(zhuǎn)賬來說溯捆,假設(shè)用戶A和用戶B兩者的錢加起來一共是5000,那么不管A和B之間如何轉(zhuǎn)賬厦瓢,轉(zhuǎn)幾次賬提揍,事務(wù)結(jié)束后兩個(gè)用戶的錢相加起來應(yīng)該還得是5000,這就是事務(wù)的一致性煮仇。
  3. 隔離性(Isolation): 并發(fā)訪問數(shù)據(jù)庫(kù)時(shí)劳跃,一個(gè)用戶的事務(wù)不被其他事務(wù)所干擾,各并發(fā)事務(wù)之間數(shù)據(jù)庫(kù)是獨(dú)立的浙垫;
    對(duì)于任意兩個(gè)并發(fā)的事務(wù)T1和T2刨仑,在事務(wù)T1看來,T2要么在T1開始之前就已經(jīng)結(jié)束夹姥,要么在T1結(jié)束之后才開始杉武,這樣每個(gè)事務(wù)都感覺不到有其他事務(wù)在并發(fā)地執(zhí)行。
  4. 持久性(Durability): 一個(gè)事務(wù)被提交之后辙售。它對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的改變是持久的轻抱,即使數(shù)據(jù)庫(kù)發(fā)生故障也不應(yīng)該對(duì)其有任何影響。

二. 并發(fā)事務(wù)存在的問題

  1. 臟讀
    臟讀是指在一個(gè)事務(wù)處理過程里讀取了另一個(gè)未提交的事務(wù)中的數(shù)據(jù)旦部。
      當(dāng)一個(gè)事務(wù)正在多次修改某個(gè)數(shù)據(jù)祈搜,而在這個(gè)事務(wù)中這多次的修改都還未提交,這時(shí)一個(gè)并發(fā)的事務(wù)來訪問該數(shù)據(jù)士八,就會(huì)造成兩個(gè)事務(wù)得到的數(shù)據(jù)不一致容燕。
    例如:用戶A向用戶B轉(zhuǎn)賬100元,對(duì)應(yīng)SQL命令如下
    update account set money=money+100 where name=’B’; (此時(shí)A通知B)
    update account set money=money - 100 where name=’A’;
      當(dāng)只執(zhí)行第一條SQL時(shí)婚度,A通知B查看賬戶蘸秘,B發(fā)現(xiàn)確實(shí)錢已到賬(此時(shí)即發(fā)生了臟讀),而之后無(wú)論第二條SQL是否執(zhí)行陕见,只要該事務(wù)不提交秘血,則所有操作都將回滾,那么當(dāng)B以后再次查看賬戶時(shí)就會(huì)發(fā)現(xiàn)錢其實(shí)并沒有轉(zhuǎn)评甜。
  2. 不可重復(fù)讀
    不可重復(fù)讀是指在對(duì)于數(shù)據(jù)庫(kù)中的某個(gè)數(shù)據(jù)灰粮,一個(gè)事務(wù)范圍內(nèi)多次查詢卻返回了不同的數(shù)據(jù)值,這是由于在查詢間隔忍坷,被另一個(gè)事務(wù)修改并提交了粘舟。
    不可重復(fù)讀和臟讀的區(qū)別是熔脂,臟讀是某一事務(wù)讀取了另一個(gè)事務(wù)未提交的臟數(shù)據(jù)貌虾,而不可重復(fù)讀則是讀取了前一事務(wù)提交的數(shù)據(jù)郭计。
  3. 丟失修改
    指在一個(gè)事務(wù)讀取一個(gè)數(shù)據(jù)時(shí),另外一個(gè)事務(wù)也訪問了該數(shù)據(jù)癣猾,那么在第一個(gè)事務(wù)中修改了這個(gè)數(shù)據(jù)后晰骑,第二個(gè)事務(wù)也修改了這個(gè)數(shù)據(jù)适秩。
    例如:事務(wù)1讀取某表中的數(shù)據(jù)A=20,事務(wù)2也讀取A=20硕舆,事務(wù)1修改A=A-1秽荞,事務(wù)2也修改A=A-1,最終結(jié)果A=19抚官,事務(wù)1的修改被丟失扬跋。
  4. 幻讀
    幻讀是事務(wù)非獨(dú)立執(zhí)行時(shí)發(fā)生的一種現(xiàn)象。例如事務(wù)T1對(duì)一個(gè)表中所有的行的某個(gè)數(shù)據(jù)項(xiàng)做了從“1”修改為“2”的操作凌节,這時(shí)事務(wù)T2又對(duì)這個(gè)表中插入了一行數(shù)據(jù)項(xiàng)钦听,而這個(gè)數(shù)據(jù)項(xiàng)的數(shù)值還是為“1”并且提交給數(shù)據(jù)庫(kù)。而操作事務(wù)T1的用戶如果再查看剛剛修改的數(shù)據(jù)倍奢,會(huì)發(fā)現(xiàn)還有一行沒有修改朴上,其實(shí)這行是從事務(wù)T2中添加的,就好像產(chǎn)生幻覺一樣娱挨,這就是發(fā)生了幻讀余指。
    幻讀和不可重復(fù)讀都是讀取了另一條已經(jīng)提交的事務(wù)。不可重復(fù)讀的重點(diǎn)是修改跷坝,幻讀的重點(diǎn)在于新增或者刪除。
    例1(同樣的條件, 你讀取過的數(shù)據(jù), 再次讀取出來發(fā)現(xiàn)值不一樣了 ):事務(wù)1中的A先生讀取自己的工資為 1000的操作還沒完成碉碉,事務(wù)2中的B先生就修改了A的工資為2000柴钻,導(dǎo) 致A再讀自己的工資時(shí)工資變?yōu)?2000;這就是不可重復(fù)讀垢粮。
    例2(同樣的條件, 第1次和第2次讀出來的記錄數(shù)不一樣 ):假某工資單表中工資大于3000的有4人贴届,事務(wù)1讀取了所有工資大于3000的人,共查到4條記錄蜡吧,這時(shí)事務(wù)2 又插入了一條工資大于3000的記錄毫蚓,事務(wù)1再次讀取時(shí)查到的記錄就變?yōu)榱?條,這樣就導(dǎo)致了幻讀昔善。

三. 事務(wù)隔離級(jí)別
SQL 標(biāo)準(zhǔn)定義了四個(gè)隔離級(jí)別:

  1. READ-UNCOMMITTED(讀取未提交): 最低的隔離級(jí)別元潘,允許讀取尚未提交的數(shù)據(jù)變更,可能會(huì)導(dǎo)致臟讀君仆、幻讀或不可重復(fù)讀翩概。
  2. READ-COMMITTED(讀取已提交): 允許讀取并發(fā)事務(wù)已經(jīng)提交的數(shù)據(jù)牲距,可以阻止臟讀,但是幻讀或不可重復(fù)讀仍有可能發(fā)生钥庇。
  3. REPEATABLE-READ(可重復(fù)讀): 對(duì)同一字段的多次讀取結(jié)果都是一致的牍鞠,除非數(shù)據(jù)是被本身事務(wù)自己所修改,可以阻止臟讀和不可重復(fù)讀评姨,但幻讀仍有可能發(fā)生难述。
  4. SERIALIZABLE(可串行化): 最高的隔離級(jí)別,完全服從ACID的隔離級(jí)別吐句。所有的事務(wù)依次逐個(gè)執(zhí)行胁后,這樣事務(wù)之間就完全不可能產(chǎn)生干擾,也就是說蕴侧,該級(jí)別可以防止臟讀择同、不可重復(fù)讀以及幻讀。
image.png

MySQL InnoDB存儲(chǔ)引擎默認(rèn)支持的隔離級(jí)別是REPETABLE-READ(可重復(fù)讀)净宵。
與 SQL 標(biāo)準(zhǔn)不同的地方在于InnoDB 存儲(chǔ)引擎在 REPEATABLE-READ(可重讀)事務(wù)隔離級(jí)別下使用的是Next-Key Lock 鎖算法敲才,因此可以避免幻讀的產(chǎn)生,這與其他數(shù)據(jù)庫(kù)系統(tǒng)(如 SQL Server)是不同的择葡。所以說InnoDB 存儲(chǔ)引擎的默認(rèn)支持的隔離級(jí)別是 REPEATABLE-READ(可重讀) 已經(jīng)可以完全保證事務(wù)的隔離性要求紧武,即達(dá)到了 SQL標(biāo)準(zhǔn)的SERIALIZABLE(可串行化)隔離級(jí)別。
InnoDB 存儲(chǔ)引擎在 分布式事務(wù) 的情況下一般會(huì)用到SERIALIZABLE(可串行化)隔離級(jí)別敏储。

演示:
臟讀(讀取未提交)


image.png

讀取結(jié)果:


image.png
image.png

重復(fù)執(zhí)行第3步讀取結(jié)果:


image.png
image.png

讀取結(jié)果:


image.png

演示:
避免臟讀


image.png

讀取結(jié)果:


image.png
image.png

重復(fù)執(zhí)行第3步讀取結(jié)果:


image.png
image.png

重復(fù)執(zhí)行第3步讀取結(jié)果:


image.png

演示:
不可重復(fù)讀
(同避免臟讀)

演示:
可重復(fù)讀


image.png

讀取結(jié)果:


image.png
image.png

重復(fù)執(zhí)行第3步讀取結(jié)果:


image.png

表數(shù)據(jù):


image.png

演示:
防止幻讀


image.png

讀取結(jié)果:


image.png
image.png

重復(fù)執(zhí)行第3步執(zhí)行結(jié)果:


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末阻星,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子已添,更是在濱河造成了極大的恐慌妥箕,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件更舞,死亡現(xiàn)場(chǎng)離奇詭異畦幢,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)缆蝉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門宇葱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人刊头,你說我怎么就攤上這事黍瞧。” “怎么了原杂?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵印颤,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我污尉,道長(zhǎng)膀哲,這世上最難降的妖魔是什么往产? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮某宪,結(jié)果婚禮上仿村,老公的妹妹穿的比我還像新娘。我一直安慰自己兴喂,他們只是感情好蔼囊,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著衣迷,像睡著了一般畏鼓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上壶谒,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天云矫,我揣著相機(jī)與錄音,去河邊找鬼汗菜。 笑死让禀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的陨界。 我是一名探鬼主播巡揍,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼菌瘪!你這毒婦竟也來了腮敌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤俏扩,失蹤者是張志新(化名)和其女友劉穎糜工,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體录淡,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡啤斗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赁咙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡免钻,死狀恐怖彼水,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情极舔,我是刑警寧澤凤覆,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站拆魏,受9級(jí)特大地震影響盯桦,放射性物質(zhì)發(fā)生泄漏慈俯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一拥峦、第九天 我趴在偏房一處隱蔽的房頂上張望贴膘。 院中可真熱鬧,春花似錦略号、人聲如沸刑峡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)突梦。三九已至,卻和暖如春羽利,著一層夾襖步出監(jiān)牢的瞬間宫患,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工这弧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留娃闲,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓当宴,卻偏偏與公主長(zhǎng)得像畜吊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子户矢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

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