事務(wù)的 ACID 特性 與 事務(wù)的隔離級(jí)別

事務(wù)的四個(gè)特性(ACID)

如果一個(gè)數(shù)據(jù)庫聲稱支持事務(wù)的操作,那么該數(shù)據(jù)庫必須要具備以下四個(gè)特性:

  1. 原子性Atomicity)
      原子性是指事務(wù)包含的所有操作要么全部成功募寨,要么全部失敗回滾。一旦事務(wù)在運(yùn)行中出現(xiàn)錯(cuò)誤苛谷,直接回滾到未啟動(dòng)事務(wù)前格郁。

  2. 一致性Consistency)
      一致性是指事務(wù)必須使數(shù)據(jù)庫從一個(gè)一致性狀態(tài)變換到另一個(gè)一致性狀態(tài),也就是說一個(gè)事務(wù)執(zhí)行之前和執(zhí)行之后都必須處于一致性狀態(tài)锣尉。多個(gè)事務(wù)并發(fā)的情況下决采,也要保證系統(tǒng)數(shù)據(jù)有如同串行操作一樣的一致效果。

  3. 隔離性Isolation)
      隔離性是當(dāng)多個(gè)用戶并發(fā)訪問數(shù)據(jù)庫時(shí),數(shù)據(jù)庫為每一個(gè)用戶開啟的事務(wù)爱谁,不能被其他事務(wù)的操作所干擾孝偎,多個(gè)并發(fā)事務(wù)之間要相互隔離,仿佛是系統(tǒng)內(nèi)唯一操作寺旺。
      即要達(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ù)庫中的數(shù)據(jù)的改變就是永久性的,即便是在數(shù)據(jù)庫系統(tǒng)遇到故障的情況下也不會(huì)丟失提交事務(wù)的操作兵琳。

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

先來看看如果不考慮事務(wù)的隔離性骇径,會(huì)發(fā)生的幾種問題:

  1. 第一類丟失更新(Update Lost)
      此種更新丟失是因?yàn)榛貪L的原因,所以也叫回滾丟失破衔。此時(shí)兩個(gè)事務(wù)同時(shí)更新 count,兩個(gè)事務(wù)都讀取到 100嫡丙,事務(wù)一更新成功并提交读第,count=100+1=101,事務(wù)二出于某種原因更新失敗了父泳,然后回滾,事務(wù)二就把 count 還原為它一開始讀到的 100惠窄,此時(shí)事務(wù)一的更新就這樣丟失了。
  2. 臟讀(Dirty Read)
      臟讀是指在一個(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ā)生了臟讀)蹈丸,而之后無論第二條 SQL 是否執(zhí)行,只要該事務(wù)不提交逻杖,則所有操作都將回滾,那么當(dāng) B 以后再次查看賬戶時(shí)就會(huì)發(fā)現(xiàn)錢其實(shí)并沒有轉(zhuǎn)闻伶。

  1. 不可重復(fù)讀(Not Repeatable Read)
      不可重復(fù)讀是指在對(duì)于數(shù)據(jù)庫中的某個(gè)數(shù)據(jù)够话,一個(gè)事務(wù)范圍內(nèi)多次查詢卻返回了不同的數(shù)據(jù)值,這是由于在查詢間隔女嘲,被另一個(gè)事務(wù)修改并提交了。
      不可重復(fù)讀和臟讀的區(qū)別是澡为,臟讀是某一事務(wù)讀取了另一個(gè)事務(wù)未提交的臟數(shù)據(jù),而不可重復(fù)讀則是讀取了前一事務(wù)提交的數(shù)據(jù)顶别。
      在某些情況下,不可重復(fù)讀并不是問題完慧,比如我們多次查詢某個(gè)數(shù)據(jù)當(dāng)然以最后查詢得到的結(jié)果為主剩失。但在另一些情況下就有可能發(fā)生問題,例如對(duì)于 A 和 B 依次查詢就可能不同拴孤,影響后續(xù)的操作。

  2. 第二類丟失更新(Second Update Lost)
      此種更新丟失是因?yàn)楦卤黄渌聞?wù)給覆蓋了鞭执,也可以叫覆蓋丟失芒粹。舉個(gè)例子,兩個(gè)事務(wù)同時(shí)更新 count化漆,都讀取 100 這個(gè)初始值座云,事務(wù)一先更新成功并提交,count=100+1=101疙教,事務(wù)二后更新成功并提交,count=100+1=101限佩,由于事務(wù)二 count 還是從 100 開始增加裸弦,事務(wù)一的更新就這樣丟失了。

  3. 虛讀(幻讀)(Phantom Read)
      幻讀是事務(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ù)庫背伴。而操作事務(wù) T1 的用戶如果再查看剛剛修改的數(shù)據(jù),會(huì)發(fā)現(xiàn)還有一行沒有修改憔四,其實(shí)這行是從事務(wù) T2 中添加的览闰,就好像產(chǎn)生幻覺一樣,這就是發(fā)生了幻讀压鉴。
      幻讀和不可重復(fù)讀都是讀取了另一條已經(jīng)提交的事務(wù),所不同的是不可重復(fù)讀查詢的都是同一個(gè)數(shù)據(jù)項(xiàng)掩幢,而幻讀針對(duì)的是一批數(shù)據(jù)整體(比如數(shù)據(jù)的個(gè)數(shù))上鞠。

現(xiàn)在來看看 MySQL 數(shù)據(jù)庫為我們提供的四種隔離級(jí)別以及可避免的問題

隔離級(jí)別 第一類丟失更新 臟讀 不可重復(fù)讀 第二類丟失更新 幻讀
Serializable
(串行化)
Repeatable read
(可重復(fù)讀)
×
Read committed
(讀已提交)
× × ×
Read uncommitted
(讀未提交)
× × × × ×

在 MySQL 數(shù)據(jù)庫中默認(rèn)的隔離級(jí)別為 Repeatable read(可重復(fù)讀)芍阎。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末缨恒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子岭佳,更是在濱河造成了極大的恐慌萧锉,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叶洞,死亡現(xiàn)場(chǎng)離奇詭異禀崖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)波附,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來封寞,“玉大人,你說我怎么就攤上這事沾瓦∏矗” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵缕探,是天一觀的道長还蹲。 經(jīng)常有香客問我,道長潭兽,這世上最難降的妖魔是什么斗遏? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮账蓉,結(jié)果婚禮上逾一,老公的妹妹穿的比我還像新娘。我一直安慰自己遵堵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布汪茧。 她就那樣靜靜地躺著限番,像睡著了一般。 火紅的嫁衣襯著肌膚如雪扩灯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天惧磺,我揣著相機(jī)與錄音捻撑,去河邊找鬼。 笑死顾患,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的设预。 我是一名探鬼主播犁河,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼宾符!你這毒婦竟也來了彭谁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎考润,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唱矛,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡井辜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年粥脚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刷允。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖纤怒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情熄驼,我是刑警寧澤烘豹,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站阐虚,受9級(jí)特大地震影響蚌卤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逊彭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一侮叮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧囊榜,春花似錦、人聲如沸卸勺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽悟狱。三九已至,卻和暖如春苹享,著一層夾襖步出監(jiān)牢的瞬間挣菲,已是汗流浹背掷邦。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工椭赋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宣蔚。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓认境,卻偏偏與公主長得像,于是被迫代替她去往敵國和親亩冬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子硼身,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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