【精】數(shù)據(jù)庫(kù)事務(wù)的隔離級(jí)別通俗化闡述

數(shù)據(jù)庫(kù)事務(wù)的隔離級(jí)別有4種,由低到高分別為Read uncommitted 、Read committed 、Repeatable read 、Serializable 。而且,在事務(wù)的并發(fā)操作中可能會(huì)出現(xiàn)臟讀,不可重復(fù)讀,幻讀。下面通過(guò)事例一一闡述它們的概念與聯(lián)系。

Read uncommitted

讀未提交,顧名思義,就是一個(gè)事務(wù)可以讀取另一個(gè)未提交事務(wù)的數(shù)據(jù)。

事例:老板要給程序員發(fā)工資,程序員的工資是3.6萬(wàn)/月。但是發(fā)工資時(shí)老板不小心按錯(cuò)了數(shù)字,按成3.9萬(wàn)/月,該錢已經(jīng)打到程序員的戶口,但是事務(wù)還沒(méi)有提交,就在這時(shí),程序員去查看自己這個(gè)月的工資,發(fā)現(xiàn)比往常多了3千元,以為漲工資了非常高興。但是老板及時(shí)發(fā)現(xiàn)了不對(duì),馬上回滾差點(diǎn)就提交了的事務(wù),將數(shù)字改成3.6萬(wàn)再提交。

分析:實(shí)際程序員這個(gè)月的工資還是3.6萬(wàn),但是程序員看到的是3.9萬(wàn)。他看到的是老板還沒(méi)提交事務(wù)時(shí)的數(shù)據(jù)。這就是臟讀。

那怎么解決臟讀呢?Read committed!讀提交,能解決臟讀問(wèn)題。

Read committed (修改時(shí)候不允許讀)

讀提交,顧名思義,就是一個(gè)事務(wù)要等另一個(gè)事務(wù)提交后才能讀取數(shù)據(jù)。

事例:程序員拿著信用卡去享受生活(卡里當(dāng)然是只有3.6萬(wàn)),當(dāng)他埋單時(shí)(程序員事務(wù)開(kāi)啟),收費(fèi)系統(tǒng)事先檢測(cè)到他的卡里有3.6萬(wàn),就在這個(gè)時(shí)候?。〕绦騿T的妻子要把錢全部轉(zhuǎn)出充當(dāng)家用,并提交。當(dāng)收費(fèi)系統(tǒng)準(zhǔn)備扣款時(shí),再檢測(cè)卡里的金額,發(fā)現(xiàn)已經(jīng)沒(méi)錢了(第二次檢測(cè)金額當(dāng)然要等待妻子轉(zhuǎn)出金額事務(wù)提交完)。程序員就會(huì)很郁悶,明明卡里是有錢的…

分析:這就是讀提交,若有事務(wù)對(duì)數(shù)據(jù)進(jìn)行更新(UPDATE)操作時(shí),讀操作事務(wù)要等待這個(gè)更新操作事務(wù)提交后才能讀取數(shù)據(jù),可以解決臟讀問(wèn)題。但在這個(gè)事例中,出現(xiàn)了一個(gè)事務(wù)范圍內(nèi)兩個(gè)相同的查詢卻返回了不同數(shù)據(jù),這就是不可重復(fù)讀。

那怎么解決可能的不可重復(fù)讀問(wèn)題?Repeatable read !

Repeatable read (讀的時(shí)候不允許修改)

重復(fù)讀,就是在開(kāi)始讀取數(shù)據(jù)(事務(wù)開(kāi)啟)時(shí),不再允許修改操作

事例:程序員拿著信用卡去享受生活(卡里當(dāng)然是只有3.6萬(wàn)),當(dāng)他埋單時(shí)(事務(wù)開(kāi)啟,不允許其他事務(wù)的UPDATE修改操作),收費(fèi)系統(tǒng)事先檢測(cè)到他的卡里有3.6萬(wàn)。這個(gè)時(shí)候他的妻子不能轉(zhuǎn)出金額了。接下來(lái)收費(fèi)系統(tǒng)就可以扣款了。

分析:重復(fù)讀可以解決不可重復(fù)讀問(wèn)題。寫到這里,應(yīng)該明白的一點(diǎn)就是,不可重復(fù)讀對(duì)應(yīng)的是修改,即UPDATE操作。但是可能還會(huì)有幻讀問(wèn)題。因?yàn)榛米x問(wèn)題對(duì)應(yīng)的是插入INSERT操作,而不是UPDATE操作。

什么時(shí)候會(huì)出現(xiàn)幻讀?

事例:程序員某一天去消費(fèi),花了2千元,然后他的妻子去查看他今天的消費(fèi)記錄(全表掃描FTS,妻子事務(wù)開(kāi)啟),看到確實(shí)是花了2千元,就在這個(gè)時(shí)候,程序員花了1萬(wàn)買了一部電腦,即新增INSERT了一條消費(fèi)記錄,并提交。當(dāng)妻子打印程序員的消費(fèi)記錄清單時(shí)(妻子事務(wù)提交),發(fā)現(xiàn)花了1.2萬(wàn)元,似乎出現(xiàn)了幻覺(jué),這就是幻讀。

那怎么解決幻讀問(wèn)題?Serializable!

Serializable 序列化 (讀的時(shí)候不允許修改插入)

Serializable 是最高的事務(wù)隔離級(jí)別,在該級(jí)別下,事務(wù)串行化順序執(zhí)行,可以避免臟讀、不可重復(fù)讀與幻讀。但是這種事務(wù)隔離級(jí)別效率低下,比較耗數(shù)據(jù)庫(kù)性能,一般不使用。

值得一提的是:大多數(shù)數(shù)據(jù)庫(kù)默認(rèn)的事務(wù)隔離級(jí)別是Read committed,比如Sql Server , Oracle。Mysql的默認(rèn)隔離級(jí)別是Repeatable read。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容