您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“mysql中臟讀、不可重復(fù)讀和幻讀的概念”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
在現(xiàn)代關(guān)系型數(shù)據(jù)庫(kù)中,事務(wù)機(jī)制是非常重要的,假如在多個(gè)事務(wù)并發(fā)操作數(shù)據(jù)庫(kù)時(shí),如果沒(méi)有有效的機(jī)制進(jìn)行避免就會(huì)導(dǎo)致出現(xiàn)臟讀,不可重復(fù)讀,幻讀。
1、在事務(wù)A執(zhí)行過(guò)程中,事務(wù)A對(duì)數(shù)據(jù)資源進(jìn)行了修改,事務(wù)B讀取了事務(wù)A修改后的數(shù)據(jù)。
2、由于某些原因,事務(wù)A并沒(méi)有完成提交,發(fā)生了RollBack操作,則事務(wù)B讀取的數(shù)據(jù)就是臟數(shù)據(jù)。
這種讀取到另一個(gè)事務(wù)未提交的數(shù)據(jù)的現(xiàn)象就是臟讀(Dirty Read)。
事務(wù)B讀取了兩次數(shù)據(jù)資源,在這兩次讀取的過(guò)程中事務(wù)A修改了數(shù)據(jù),導(dǎo)致事務(wù)B在這兩次讀取出來(lái)的數(shù)據(jù)不一致。
這種在同一個(gè)事務(wù)中,前后兩次讀取的數(shù)據(jù)不一致的現(xiàn)象就是不可重復(fù)讀(Nonrepeatable Read)。
事務(wù)B前后兩次讀取同一個(gè)范圍的數(shù)據(jù),在事務(wù)B兩次讀取的過(guò)程中事務(wù)A新增了數(shù)據(jù),導(dǎo)致事務(wù)B后一次讀取到前一次查詢沒(méi)有看到的行。
幻讀和不可重復(fù)讀有些類似,但是幻讀強(qiáng)調(diào)的是集合的增減,而不是單條數(shù)據(jù)的更新。
事務(wù)A和事務(wù)B都對(duì)數(shù)據(jù)進(jìn)行更新,但是事務(wù)A由于某種原因事務(wù)回滾了,把已經(jīng)提交的事務(wù)B的更新數(shù)據(jù)給覆蓋了。這種現(xiàn)象就是第一類更新丟失。
其實(shí)跟第一類更新丟失有點(diǎn)類似,也是兩個(gè)事務(wù)同時(shí)對(duì)數(shù)據(jù)進(jìn)行更新,但是事務(wù)A的更新把已提交的事務(wù)B的更新數(shù)據(jù)給覆蓋了。這種現(xiàn)象就是第二類更新丟失。
為了解決以上的問(wèn)題,主流的關(guān)系型數(shù)據(jù)庫(kù)都會(huì)提供四種事務(wù)的隔離級(jí)別。事務(wù)隔離級(jí)別從低到高分別是:讀未提交、讀已提交、可重復(fù)讀、串行化。事務(wù)隔離級(jí)別等級(jí)越高,越能保證數(shù)據(jù)的一致性和完整性,但是執(zhí)行效率也越低。所以在設(shè)置數(shù)據(jù)庫(kù)的事務(wù)隔離級(jí)別時(shí)需要做一下權(quán)衡,MySQL默認(rèn)是可重復(fù)讀的級(jí)別。
讀未提交(Read Uncommitted),是最低的隔離級(jí)別,所有的事務(wù)都可以看到其他未提交的事務(wù)的執(zhí)行結(jié)果。只能防止第一類更新丟失,不能解決臟讀,可重復(fù)讀,幻讀,所以很少應(yīng)用于實(shí)際項(xiàng)目。
讀已提交(Read Committed), 在該隔離級(jí)別下,一個(gè)事務(wù)的更新操作結(jié)果只有在該事務(wù)提交之后,另一個(gè)事務(wù)才可能讀取到同一筆數(shù)據(jù)更新后的結(jié)果??梢苑乐古K讀和第一類更新丟失,但是不能解決可重復(fù)讀和幻讀的問(wèn)題。
可重復(fù)讀(Repeatable Read),MySQL默認(rèn)的隔離級(jí)別。在該隔離級(jí)別下,一個(gè)事務(wù)多次讀同一個(gè)數(shù)據(jù),在這個(gè)事務(wù)還沒(méi)結(jié)束時(shí),其他事務(wù)不能訪問(wèn)該數(shù)據(jù)(包括了讀寫(xiě)),這樣就可以在同一個(gè)事務(wù)內(nèi)兩次讀到的數(shù)據(jù)是一樣的??梢苑乐古K讀、不可重復(fù)讀、第一類更新丟失、第二類更新丟失的問(wèn)題,不過(guò)還是會(huì)出現(xiàn)幻讀。
串行化(Serializable),這是最高的隔離級(jí)別。它要求事務(wù)序列化執(zhí)行,事務(wù)只能一個(gè)接著一個(gè)地執(zhí)行,不能并發(fā)執(zhí)行。在這個(gè)級(jí)別,可以解決上面提到的所有并發(fā)問(wèn)題,但可能導(dǎo)致大量的超時(shí)現(xiàn)象和鎖競(jìng)爭(zhēng),通常不會(huì)用這個(gè)隔離級(jí)別。
“mysql中臟讀、不可重復(fù)讀和幻讀的概念”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。