真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

四類隔離級(jí)別

創(chuàng)新互聯(lián)公司自2013年創(chuàng)立以來(lái),是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元水富做網(wǎng)站,已為上家服務(wù),為水富各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792

??SQL標(biāo)準(zhǔn)定義了4類隔離級(jí)別,包括了一些具體規(guī)則,用來(lái)限定事務(wù)內(nèi)外的哪些改變是可見(jiàn)的,哪些是不可見(jiàn)的。低級(jí)別的隔離級(jí)一般支持更高的并發(fā)處理,并擁有更低的系統(tǒng)開銷。

Read Uncommitted(讀取未提交內(nèi)容)

??在該隔離級(jí)別,所有事務(wù)都可以看到其他未提交事務(wù)的執(zhí)行結(jié)果。本隔離級(jí)別很少用于實(shí)際應(yīng)用,因?yàn)樗男阅芤膊槐绕渌?jí)別好多少。讀取未提交的數(shù)據(jù),也被稱之為臟讀(Dirty Read)。

舉例:

??公司發(fā)工資了,把50000元打到我的賬號(hào)上,但是該事務(wù)并未提交,而我正好去查看賬戶,發(fā)現(xiàn)工資已經(jīng)到賬,是50000元整,非常高興??墒遣恍业氖?,領(lǐng)導(dǎo)發(fā)現(xiàn)發(fā)給的工資金額不對(duì),是2000元,于是迅速回滾了事務(wù),修改金額后,將事務(wù)提交,最后我實(shí)際的工資只有2000元,空歡喜一場(chǎng)。

??臟讀是兩個(gè)并發(fā)的事務(wù),“事務(wù)A:領(lǐng)導(dǎo)發(fā)工資”、“事務(wù)B:我查詢工資賬戶”,事務(wù)B讀取了事務(wù)A尚未提交的數(shù)據(jù)。

??當(dāng)隔離級(jí)別設(shè)置為Read uncommitted時(shí),就可能出現(xiàn)臟讀,如何避免臟讀,請(qǐng)看下一個(gè)隔離級(jí)別。

Read Committed(讀取提交內(nèi)容)

??這是大多數(shù)數(shù)據(jù)庫(kù)系統(tǒng)的默認(rèn)隔離級(jí)別(但不是MySQL默認(rèn)的)。它滿足了隔離的簡(jiǎn)單定義:一個(gè)事務(wù)只能看見(jiàn)已經(jīng)提交事務(wù)所做的改變。這種隔離級(jí)別 也支持所謂的不可重復(fù)讀(Nonrepeatable Read),因?yàn)橥皇聞?wù)的其他實(shí)例在該實(shí)例處理其間可能會(huì)有新的commit,所以同一select可能返回不同結(jié)果。

舉例:

??我拿著工資卡去消費(fèi),系統(tǒng)讀取到卡里確實(shí)有2000元,而此時(shí)老婆也正好在網(wǎng)上轉(zhuǎn)賬,把工資卡的2000元轉(zhuǎn)到她賬戶,并在我之前提交了事務(wù),當(dāng)我扣款時(shí),系統(tǒng)檢查到工資卡已經(jīng)沒(méi)有錢,扣款失敗,十分納悶,明明卡里有錢,為何…

??不可重復(fù)讀是兩個(gè)并發(fā)的事務(wù),“事務(wù)A:消費(fèi)”、“事務(wù)B:老婆網(wǎng)上轉(zhuǎn)賬”,事務(wù)A事先讀取了數(shù)據(jù),事務(wù)B緊接了更新了數(shù)據(jù),并提交了事務(wù),而事務(wù)A再次讀取該數(shù)據(jù)時(shí),數(shù)據(jù)已經(jīng)發(fā)生了改變。

??當(dāng)隔離級(jí)別設(shè)置為Read committed時(shí),避免了臟讀,但是可能會(huì)造成不可重復(fù)讀。

Repeatable Read(可重讀)

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

舉例:

??當(dāng)隔離級(jí)別設(shè)置為Repeatable read時(shí),可以避免不可重復(fù)讀。當(dāng)我拿著工資卡去消費(fèi)時(shí),一旦系統(tǒng)開始讀取工資卡信息(即事務(wù)開始),我老婆就不可能對(duì)該記錄進(jìn)行修改,也就是不能在此時(shí)轉(zhuǎn)賬。無(wú)錫人流手術(shù)多少錢 http://mobile.chnk120.com/

??雖然Repeatable read避免了不可重復(fù)讀,但還有可能出現(xiàn)幻讀。例如:老婆工作在銀行部門,她時(shí)常通過(guò)銀行內(nèi)部系統(tǒng)查看我的信用卡消費(fèi)記錄。有一天,她正查詢到我當(dāng)月信用卡的總消費(fèi)金額(select sum(amount) from transaction where month = 本月)為80元,而我此時(shí)正好在外面吃完大餐后在收銀臺(tái)買單,消費(fèi)1000元,即新增了一條1000元的消費(fèi)記錄(insert transaction … ),并提交了事務(wù),隨后老婆將我的當(dāng)月信用卡消費(fèi)的明細(xì)打印到A4紙上,卻發(fā)現(xiàn)消費(fèi)總額為1080元,老婆很詫異,以為出現(xiàn)了幻覺(jué),幻讀就這樣產(chǎn)生了。

Serializable(可串行化)

??這是最高的隔離級(jí)別,它通過(guò)強(qiáng)制事務(wù)排序,使之不可能相互沖突,從而解決幻讀問(wèn)題。簡(jiǎn)言之,它是在每個(gè)讀的數(shù)據(jù)行上加上共享鎖。在這個(gè)級(jí)別,可能導(dǎo)致大量的超時(shí)現(xiàn)象和鎖競(jìng)爭(zhēng)。

隔離級(jí)別與一致性

??這四種隔離級(jí)別采取不同的鎖類型來(lái)實(shí)現(xiàn),若讀取的是同一個(gè)數(shù)據(jù)的話,就容易發(fā)生問(wèn)題。例如:

?? 臟讀(Drity Read):某個(gè)事務(wù)已更新一份數(shù)據(jù),另一個(gè)事務(wù)在此時(shí)讀取了同一份數(shù)據(jù),由于某些原因,前一個(gè)RollBack了操作,則后一個(gè)事務(wù)所讀取的數(shù)據(jù)就會(huì)是不正確的。

?? 不可重復(fù)讀(Non-repeatable read):在一個(gè)事務(wù)的兩次查詢之中數(shù)據(jù)不一致,這可能是兩次查詢過(guò)程中間插入了一個(gè)事務(wù)更新的原有的數(shù)據(jù)。

?? 幻讀(Phantom Read):在一個(gè)事務(wù)的兩次查詢中數(shù)據(jù)筆數(shù)不一致,例如有一個(gè)事務(wù)查詢了幾列(Row)數(shù)據(jù),而另一個(gè)事務(wù)卻在此時(shí)插入了新的幾列數(shù)據(jù),先前的事務(wù)在接下來(lái)的查詢中,就會(huì)發(fā)現(xiàn)有幾列數(shù)據(jù)是它先前所沒(méi)有的。

在MySQL中,實(shí)現(xiàn)了這四種隔離級(jí)別,分別有可能產(chǎn)生問(wèn)題如下所示:

隔離級(jí)別  臟讀  不可重復(fù)讀  幻讀

讀未提交(Read Uncommitted)  √  √  √

讀已提交(Read Committed)  ×  √  √

可重復(fù)讀(Repeatable Read)  ×  ×  √

可串行化(Serializable)  ×  ×  ×

總結(jié):

Serializable (串行化):可避免臟讀、不可重復(fù)讀、幻讀的發(fā)生。

Repeatable read (可重復(fù)讀):可避免臟讀、不可重復(fù)讀的發(fā)生。

Read committed (讀已提交):可避免臟讀的發(fā)生。

Read uncommitted (讀未提交):最低級(jí)別,任何情況都無(wú)法保證。

??以上四種隔離級(jí)別最高的是Serializable級(jí)別,最低的是Read uncommitted級(jí)別,級(jí)別越高,執(zhí)行效率就越低。像Serializable這樣的級(jí)別,就是以鎖表的方式(類似于Java多線程中的鎖)使得其他的線程只能在鎖外等待,所以平時(shí)選用何種隔離級(jí)別應(yīng)該根據(jù)實(shí)際情況。在MySQL數(shù)據(jù)庫(kù)中默認(rèn)的隔離級(jí)別為Repeatable read (可重復(fù)讀)。

??在MySQL數(shù)據(jù)庫(kù)中,支持上面四種隔離級(jí)別,默認(rèn)的為Repeatable read (可重復(fù)讀);而在Oracle數(shù)據(jù)庫(kù)中,只支持Serializable (串行化)級(jí)別和Read committed (讀已提交)這兩種級(jí)別,其中默認(rèn)的為Read committed級(jí)別。


分享標(biāo)題:MySQL事務(wù)隔離級(jí)別
URL分享:http://weahome.cn/article/gosogd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部