數(shù)據(jù)庫常用的事務(wù)隔離級別都有哪些竞慢?都是什么原理先紫?

什么是事務(wù)隔離?

任何支持事務(wù)的數(shù)據(jù)庫筹煮,都必須具備四個特性遮精,分別是:原子性(Atomicity)、一致性(Consistency)败潦、隔離性(Isolation)本冲、持久性(Durability),也就是我們常說的事務(wù)ACID劫扒,這樣才能保證事務(wù)((Transaction)中數(shù)據(jù)的正確性眼俊。

image

而事務(wù)的隔離性就是指,多個并發(fā)的事務(wù)同時訪問一個數(shù)據(jù)庫時粟关,一個事務(wù)不應(yīng)該被另一個事務(wù)所干擾疮胖,每個并發(fā)的事務(wù)間要相互進(jìn)行隔離。

如果沒有事務(wù)隔離闷板,會出現(xiàn)什么樣的情況呢澎灸?

假設(shè)我們現(xiàn)在有這樣一張表(T),里面記錄了很多牛人的名字遮晚,我們不進(jìn)行事務(wù)的隔離看看會發(fā)生什么呢性昭?

image

第一天,事務(wù)A訪問了數(shù)據(jù)庫县遣,它干了一件事情糜颠,往數(shù)據(jù)庫里加上了新來的牛人的名字,但是沒有提交事務(wù)萧求。

insert into T values (4, '牛D');

這時其兴,來了另一個事務(wù)B,他要查詢所有牛人的名字夸政。

select Name from T;

這時元旬,如果沒有事務(wù)之間沒有有效隔離,那么事務(wù)B返回的結(jié)果中就會出現(xiàn)“牛D”的名字守问。這就是“臟讀(dirty read)”匀归。

第二天,事務(wù)A訪問了數(shù)據(jù)庫耗帕,他要查看ID是1的牛人的名字穆端,于是執(zhí)行了

select Name from T where ID = 1;

這時,事務(wù)B來了仿便,因為ID是1的牛人改名字了体啰,所以要更新一下字柠,然后提交了事務(wù)。

update T set Name = '不牛' where ID = 1;

接著狡赐,事務(wù)A還想再看看ID是1的牛人的名字块仆,于是又執(zhí)行了

select Name from T where ID = 1;

結(jié)果奸柬,兩次讀出來的ID是1的牛人名字竟然不相同,這就是不可重復(fù)讀(unrepeatable read)衬廷。

image

第三天鲤氢,事務(wù)A訪問了數(shù)據(jù)庫搀擂,他想要看看數(shù)據(jù)庫的牛人都有哪些,于是執(zhí)行了

select * from T;

這時候卷玉,事務(wù)B來了哨颂,往數(shù)據(jù)庫加入了一個新的牛人。

insert into T values(4, '牛D');

這時候相种,事務(wù)A忘了剛才的牛人都有哪些了威恼,于是又執(zhí)行了。

select * from T;

結(jié)果寝并,第一次有三個牛人箫措,第二次有四個牛人。

相信這個時候事務(wù)A就蒙了衬潦,剛才發(fā)生了什么斤蔓?這種情況就叫“幻讀(phantom problem)”。

image

為了防止出現(xiàn)臟讀镀岛、不可重復(fù)讀弦牡、幻讀等情況,我們就需要根據(jù)我們的實際需求來設(shè)置數(shù)據(jù)庫的隔離級別漂羊。

數(shù)據(jù)庫都有哪些隔離級別呢驾锰?

一般的數(shù)據(jù)庫,都包括以下四種隔離級別:

  • 讀未提交(Read Uncommitted)
  • 讀提交(Read Committed)
  • 可重復(fù)讀(Repeated Read)
  • 串行化(Serializable)

如何使用這些隔離級別走越,那就需要根據(jù)業(yè)務(wù)的實際情況來進(jìn)行判斷了稻据。

我們接下來就看看這四個隔離級別的具體情況

讀未提交(Read Uncommitted)

讀未提交,顧名思義买喧,就是可以讀到未提交的內(nèi)容捻悯。

因此,在這種隔離級別下淤毛,查詢是不會加鎖的今缚,也由于查詢的不加鎖,所以這種隔離級別的一致性是最差的低淡,可能會產(chǎn)生“臟讀”姓言、“不可重復(fù)讀”瞬项、“幻讀”。

如無特殊情況何荚,基本是不會使用這種隔離級別的囱淋。

讀提交(Read Committed)

讀提交,顧名思義餐塘,就是只能讀到已經(jīng)提交了的內(nèi)容妥衣。

這是各種系統(tǒng)中最常用的一種隔離級別,也是SQL Server和Oracle的默認(rèn)隔離級別戒傻。這種隔離級別能夠有效的避免臟讀税手,但除非在查詢中顯示的加鎖,如:

select * from T where ID=2 lock in share mode;
select * from T where ID=2 for update;

不然需纳,普通的查詢是不會加鎖的芦倒。
那為什么“讀提交”同“讀未提交”一樣,都沒有查詢加鎖不翩,但是卻能夠避免臟讀呢兵扬?

這就要說道另一個機(jī)制“快照(snapshot)”,而這種既能保證一致性又不加鎖的讀也被稱為“快照讀(Snapshot Read)”

image

假設(shè)沒有“快照讀”口蝠,那么當(dāng)一個更新的事務(wù)沒有提交時周霉,另一個對更新數(shù)據(jù)進(jìn)行查詢的事務(wù)會因為無法查詢而被阻塞,這種情況下亚皂,并發(fā)能力就相當(dāng)?shù)牟睢?/p>

而“快照讀”就可以完成高并發(fā)的查詢俱箱,不過,“讀提交”只能避免“臟讀”灭必,并不能避免“不可重復(fù)讀”和“幻讀”狞谱。

可重復(fù)讀(Repeated Read)

可重復(fù)讀,顧名思義禁漓,就是專門針對“不可重復(fù)讀”這種情況而制定的隔離級別跟衅,自然,它就可以有效的避免“不可重復(fù)讀”播歼。而它也是MySql的默認(rèn)隔離級別伶跷。

在這個級別下,普通的查詢同樣是使用的“快照讀”秘狞,但是叭莫,和“讀提交”不同的是,當(dāng)事務(wù)啟動時烁试,就不允許進(jìn)行“修改操作(Update)”了雇初,而“不可重復(fù)讀”恰恰是因為兩次讀取之間進(jìn)行了數(shù)據(jù)的修改,因此减响,“可重復(fù)讀”能夠有效的避免“不可重復(fù)讀”靖诗,但卻避免不了“幻讀”郭怪,因為幻讀是由于“插入或者刪除操作(Insert or Delete)”而產(chǎn)生的。

串行化(Serializable)

這是數(shù)據(jù)庫最高的隔離級別刊橘,這種級別下鄙才,事務(wù)“串行化順序執(zhí)行”,也就是一個一個排隊執(zhí)行促绵。

這種級別下攒庵,“臟讀”、“不可重復(fù)讀”绞愚、“幻讀”都可以被避免,但是執(zhí)行效率奇差颖医,性能開銷也最大位衩,所以基本沒人會用。

總結(jié)一下

為什么會出現(xiàn)“臟讀”熔萧?

因為沒有“select”操作沒有規(guī)矩糖驴。

為什么會出現(xiàn)“不可重復(fù)讀”?

因為“update”操作沒有規(guī)矩佛致。

為什么會出現(xiàn)“幻讀”贮缕?

因為“insert”和“delete”操作沒有規(guī)矩。

“讀未提(Read Uncommitted)”能預(yù)防啥俺榆?

啥都預(yù)防不了感昼。

“讀提交(Read Committed)”能預(yù)防啥?

使用“快照讀(Snapshot Read)”罐脊,避免“臟讀”定嗓,但是可能出現(xiàn)“不可重復(fù)讀”和“幻讀”。

“可重復(fù)讀(Repeated Red)”能預(yù)防啥萍桌?

使用“快照讀(Snapshot Read)”宵溅,鎖住被讀取記錄,避免出現(xiàn)“臟讀”上炎、“不可重復(fù)讀”恃逻,但是可能出現(xiàn)“幻讀”。

“串行化(Serializable)”能預(yù)防啥藕施?

排排坐寇损,吃果果,有效避免“臟讀”裳食、“不可重復(fù)讀”润绵、“幻讀”,不過效果誰用誰知道胞谈。


轉(zhuǎn)載自:https://baijiahao.baidu.com/s?id=1611918898724887602

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末尘盼,一起剝皮案震驚了整個濱河市憨愉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卿捎,老刑警劉巖配紫,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異午阵,居然都是意外死亡躺孝,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門底桂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來植袍,“玉大人,你說我怎么就攤上這事籽懦∮诟觯” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵暮顺,是天一觀的道長厅篓。 經(jīng)常有香客問我,道長捶码,這世上最難降的妖魔是什么羽氮? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮惫恼,結(jié)果婚禮上档押,老公的妹妹穿的比我還像新娘。我一直安慰自己祈纯,他們只是感情好汇荐,可當(dāng)我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盆繁,像睡著了一般掀淘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上油昂,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天革娄,我揣著相機(jī)與錄音,去河邊找鬼冕碟。 笑死拦惋,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的安寺。 我是一名探鬼主播厕妖,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼挑庶!你這毒婦竟也來了言秸?” 一聲冷哼從身側(cè)響起软能,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎举畸,沒想到半個月后查排,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抄沮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年跋核,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叛买。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡砂代,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出率挣,到底是詐尸還是另有隱情刻伊,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布难礼,位于F島的核電站娃圆,受9級特大地震影響玫锋,放射性物質(zhì)發(fā)生泄漏蛾茉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一撩鹿、第九天 我趴在偏房一處隱蔽的房頂上張望谦炬。 院中可真熱鬧,春花似錦节沦、人聲如沸键思。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吼鳞。三九已至,卻和暖如春叫搁,著一層夾襖步出監(jiān)牢的瞬間赔桌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工渴逻, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留疾党,地道東北人。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓惨奕,卻偏偏與公主長得像雪位,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子梨撞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,658評論 2 350