Java【面試必備】快速理解數(shù)據(jù)庫事務(wù)隔離級別

事務(wù)簡介

相信用過MySQL的朋友都知道事務(wù)沉填,我們也常常通過這個例子來講解事務(wù)的作用:A向B轉(zhuǎn)賬妄壶,這里可以分為兩步操作數(shù)據(jù)庫濒持,A賬戶余額減少键耕,B賬戶余額增加。但是柑营,如果在A賬戶余額減少的時候突然出現(xiàn)了數(shù)據(jù)庫宕機(jī)了等情況屈雄,是不是會出現(xiàn)A的余額變少了,但是B的余額卻沒有增加的情況呢官套?答案是否定的酒奶。原因就是數(shù)據(jù)庫支持事務(wù)(常用的關(guān)系型數(shù)據(jù),如MySQL奶赔、Oracle等)惋嚎。

事務(wù)是應(yīng)用程序中一系列嚴(yán)密的操作,所有操作必須成功完成纺阔,否則在每個操作中所作的所有更改都會被撤消瘸彤。也就是事務(wù)具有原子性,一個事務(wù)中的一系列的操作要么全部成功笛钝,要么一個都不做质况。

事務(wù)的結(jié)束有兩種愕宋,當(dāng)事務(wù)中的所以步驟全部成功執(zhí)行時,事務(wù)提交结榄。如果其中一個步驟失敗中贝,將發(fā)生回滾操作,撤消撤消之前到事務(wù)開始時的所以操作臼朗。

事務(wù)的ACID特性

這個是一個老生常談的問題邻寿,面試中也經(jīng)常會問:事務(wù)的ACID特性分別是什么?這里的ACID分別代表四個單詞:原子性( Atomicity )视哑、一致性( Consistency )绣否、隔離性( Isolation )和持續(xù)性( Durability )。

1 挡毅、原子性蒜撮。事務(wù)是數(shù)據(jù)庫的邏輯工作單位,事務(wù)中包含的各操作要么都做跪呈,要么都不做

2 段磨、一致性。事 務(wù)執(zhí)行的結(jié)果必須是使數(shù)據(jù)庫從一個一致性狀態(tài)變到另一個一致性狀態(tài)耗绿。因此當(dāng)數(shù)據(jù)庫只包含成功事務(wù)提交的結(jié)果時苹支,就說數(shù)據(jù)庫處于一致性狀態(tài)。如果數(shù)據(jù)庫系統(tǒng) 運(yùn)行中發(fā)生故障误阻,有些事務(wù)尚未完成就被迫中斷债蜜,這些未完成事務(wù)對數(shù)據(jù)庫所做的修改有一部分已寫入物理數(shù)據(jù)庫,這時數(shù)據(jù)庫就處于一種不正確的狀態(tài)究反,或者說是 不一致的狀態(tài)策幼。

3 、隔離性奴紧。一個事務(wù)的執(zhí)行不能受其它事務(wù)干擾。即一個事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對其它并發(fā)事務(wù)是隔離的晶丘,并發(fā)執(zhí)行的各個事務(wù)之間不能互相干擾黍氮。

4 、持續(xù)性浅浮。也稱永久性沫浆,指一個事務(wù)一旦提交,它對數(shù)據(jù)庫中的數(shù)據(jù)的改變就應(yīng)該是永久性的滚秩。接下來的其它操作或故障不應(yīng)該對其執(zhí)行結(jié)果有任何影響专执。

事務(wù)的隔離級別

說事務(wù)隔離級別之前,先看看如下問題:

1郁油、臟讀(Dirty Read)

所謂臟讀是指一個事務(wù)中訪問到了另外一個事務(wù)未提交的數(shù)據(jù)本股。如A事務(wù)對一條數(shù)據(jù)進(jìn)行了修改攀痊,但是事務(wù)還沒提交,此時B事務(wù)讀到了A事務(wù)修改了但是未提交的數(shù)據(jù)拄显,這就是臟讀苟径。

2、不可重復(fù)讀(Non-repeatable read)

是指在一個事務(wù)內(nèi)躬审,多次讀同一數(shù)據(jù)棘街。在這個事務(wù)還沒有結(jié)束時,另外一個事務(wù)也訪問該同一數(shù)據(jù)承边。那么遭殉,在第一個事務(wù)中的兩 次讀數(shù)據(jù)之間,由于第二個事務(wù)的修改博助,那么第一個事務(wù)兩次讀到的的數(shù)據(jù)可能是不一樣的险污。這樣就發(fā)生了在一個事務(wù)內(nèi)兩次讀到的數(shù)據(jù)是不一樣的,因此稱為是不 可重復(fù)讀翔始。

3罗心、幻讀(Phantom Read)

所謂幻讀是指同一個事務(wù)內(nèi)多次查詢返回的結(jié)果集不一樣(比如增加了或者減少了行記錄)。比如同一個事務(wù)A內(nèi)第一次查詢時候有n條記錄城瞎,但是第二次同等條件下查詢卻又n+1條記錄渤闷,這就好像產(chǎn)生了幻覺,為啥兩次結(jié)果不一樣那脖镀。其實(shí)和不可重復(fù)讀一樣飒箭,發(fā)生幻讀的原因也是另外一個事務(wù)新增或者刪除或者修改了第一個事務(wù)結(jié)果集里面的數(shù)據(jù)。不同在于不可重復(fù)讀是同一個記錄的數(shù)據(jù)內(nèi)容被修改了蜒灰,幻讀是數(shù)據(jù)行記錄變多了或者少了

了解了如上幾個問題之后弦蹂,我們再來看看四種事務(wù)隔離級別。

1强窖、Read Uncommitted(讀取未提交內(nèi)容)

在該隔離級別凸椿,所有事務(wù)都可以看到其他未提交事務(wù)的執(zhí)行結(jié)果。本隔離級別很少用于實(shí)際應(yīng)用翅溺,因為它的性能也不比其他級別好多少脑漫。讀取未提交的數(shù)據(jù),也被稱之為臟讀咙崎。

2优幸、Read Committed(讀取提交內(nèi)容)

這是大多數(shù)數(shù)據(jù)庫系統(tǒng)的默認(rèn)隔離級別(但不是MySQL默認(rèn)的)。它滿足了隔離的簡單定義:一個事務(wù)只能看見已經(jīng)提交事務(wù)所做的改變褪猛。這就是所謂的不可重復(fù)讀(Non-repeatable read)网杆。

3、Repeatable Read(可重讀)

這是MySQL的默認(rèn)事務(wù)隔離級別,它確保同一事務(wù)的多個實(shí)例在并發(fā)讀取數(shù)據(jù)時碳却,會看到同樣的數(shù)據(jù)行队秩。不過理論上,這會導(dǎo)致另一個棘手的問題:幻讀 (Phantom Read)追城。簡單的說刹碾,幻讀指當(dāng)用戶讀取某一范圍的數(shù)據(jù)行時,另一個事務(wù)又在該范圍內(nèi)插入了新行座柱,當(dāng)用戶再讀取該范圍的數(shù)據(jù)行時迷帜,會發(fā)現(xiàn)有新的“幻影” 行。InnoDB和Falcon存儲引擎通過多版本并發(fā)控制(MVCC色洞,Multiversion Concurrency Control)機(jī)制解決了該問題戏锹。

4、Serializable(串行化)

這是最高的隔離級別火诸,它通過強(qiáng)制事務(wù)排序锦针,使之不可能相互沖突,從而解決幻讀問題置蜀。簡言之奈搜,它是在每個讀的數(shù)據(jù)行上加上共享鎖。在這個級別盯荤,可能導(dǎo)致大量的超時現(xiàn)象和鎖競爭馋吗。

四種隔離級別可能出現(xiàn)的問題總結(jié)

除了性能最差的Serializable(串行化)隔離級別不會出現(xiàn)臟讀、不可重復(fù)讀秋秤、幻讀問題之外宏粤,其他的隔離級別都存在一個或多個問題。不過MySQL的InnoDB引擎通過MVCC的方式解決了Repeatable Read的幻讀問題灼卢。

查看隔離級別

# 查看當(dāng)前連接的隔離級別SELECT @@session.tx_isolation;# 查看全局的事務(wù)隔離級別SELECT @@global.tx_isolation;復(fù)制代碼

設(shè)置事務(wù)隔離級別

1绍哎、全局修改

在mysql的配置文件上修改,如windows的mysql.ini鞋真,Linux為my.cnf崇堰。

#可選參數(shù)有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.[mysqld]transaction-isolation = REPEATABLE-READ復(fù)制代碼

2、通過命令對當(dāng)前連接設(shè)置

# 可選參數(shù)為:read uncommitted涩咖、read committed赶袄、repeatable read、serializablesetsession transaction isolation level xxx

關(guān)注公眾號領(lǐng)資料

搜索公眾號【Java耕耘者】,回復(fù)【Java】抠藕,即可獲取大量優(yōu)質(zhì)電子書和Java、kafka蒋困、nginx盾似、MySQL等視頻資料

作者:happyjava

鏈接:https://juejin.im/post/5d5575dde51d4561a705badd

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子零院,更是在濱河造成了極大的恐慌溉跃,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件告抄,死亡現(xiàn)場離奇詭異撰茎,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)打洼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門龄糊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人募疮,你說我怎么就攤上這事炫惩。” “怎么了阿浓?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵他嚷,是天一觀的道長。 經(jīng)常有香客問我芭毙,道長筋蓖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任退敦,我火速辦了婚禮粘咖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘苛聘。我一直安慰自己涂炎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布设哗。 她就那樣靜靜地躺著唱捣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪网梢。 梳的紋絲不亂的頭發(fā)上震缭,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機(jī)與錄音战虏,去河邊找鬼拣宰。 笑死,一個胖子當(dāng)著我的面吹牛烦感,可吹牛的內(nèi)容都是我干的巡社。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼手趣,長吁一口氣:“原來是場噩夢啊……” “哼晌该!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤朝群,失蹤者是張志新(化名)和其女友劉穎燕耿,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姜胖,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡誉帅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了右莱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚜锨。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖隧出,靈堂內(nèi)的尸體忽然破棺而出踏志,到底是詐尸還是另有隱情,我是刑警寧澤胀瞪,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布针余,位于F島的核電站,受9級特大地震影響凄诞,放射性物質(zhì)發(fā)生泄漏圆雁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一帆谍、第九天 我趴在偏房一處隱蔽的房頂上張望伪朽。 院中可真熱鬧,春花似錦汛蝙、人聲如沸烈涮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坚洽。三九已至,卻和暖如春西土,著一層夾襖步出監(jiān)牢的瞬間讶舰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工需了, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留跳昼,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓肋乍,卻偏偏與公主長得像鹅颊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子墓造,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

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