<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一網(wǎng)打盡,什么是臟讀、不可重復(fù)讀、幻讀?別說你不知道

          共 1523字,需瀏覽 4分鐘

           ·

          2021-04-27 12:56

          臟讀、不可重復(fù)讀、幻讀

          在現(xiàn)代關(guān)系型數(shù)據(jù)庫中,事務(wù)機制是非常重要的,假如在多個事務(wù)并發(fā)操作數(shù)據(jù)庫時,如果沒有有效的機制進(jìn)行避免就會導(dǎo)致出現(xiàn)臟讀,不可重復(fù)讀,幻讀。

          臟讀

          1、在事務(wù)A執(zhí)行過程中,事務(wù)A對數(shù)據(jù)資源進(jìn)行了修改,事務(wù)B讀取了事務(wù)A修改后的數(shù)據(jù)。

          2、由于某些原因,事務(wù)A并沒有完成提交,發(fā)生了RollBack操作,則事務(wù)B讀取的數(shù)據(jù)就是臟數(shù)據(jù)。

          這種讀取到另一個事務(wù)未提交的數(shù)據(jù)的現(xiàn)象就是臟讀(Dirty Read)。

          不可重復(fù)讀

          事務(wù)B讀取了兩次數(shù)據(jù)資源,在這兩次讀取的過程中事務(wù)A修改了數(shù)據(jù),導(dǎo)致事務(wù)B在這兩次讀取出來的數(shù)據(jù)不一致。

          這種在同一個事務(wù)中,前后兩次讀取的數(shù)據(jù)不一致的現(xiàn)象就是不可重復(fù)讀(Nonrepeatable Read)。

          幻讀

          事務(wù)B前后兩次讀取同一個范圍的數(shù)據(jù),在事務(wù)B兩次讀取的過程中事務(wù)A新增了數(shù)據(jù),導(dǎo)致事務(wù)B后一次讀取到前一次查詢沒有看到的行。

          幻讀和不可重復(fù)讀有些類似,但是幻讀強調(diào)的是集合的增減,而不是單條數(shù)據(jù)的更新。

          第一類更新丟失

          事務(wù)A和事務(wù)B都對數(shù)據(jù)進(jìn)行更新,但是事務(wù)A由于某種原因事務(wù)回滾了,把已經(jīng)提交的事務(wù)B的更新數(shù)據(jù)給覆蓋了。這種現(xiàn)象就是第一類更新丟失。

          第二類更新丟失

          其實跟第一類更新丟失有點類似,也是兩個事務(wù)同時對數(shù)據(jù)進(jìn)行更新,但是事務(wù)A的更新把已提交的事務(wù)B的更新數(shù)據(jù)給覆蓋了。這種現(xiàn)象就是第二類更新丟失。

          事務(wù)隔離級別

          為了解決以上的問題,主流的關(guān)系型數(shù)據(jù)庫都會提供四種事務(wù)的隔離級別。事務(wù)隔離級別從低到高分別是:讀未提交、讀已提交、可重復(fù)讀、串行化。事務(wù)隔離級別等級越高,越能保證數(shù)據(jù)的一致性和完整性,但是執(zhí)行效率也越低。所以在設(shè)置數(shù)據(jù)庫的事務(wù)隔離級別時需要做一下權(quán)衡,MySQL默認(rèn)是可重復(fù)讀的級別

          讀未提交

          讀未提交(Read Uncommitted),是最低的隔離級別,所有的事務(wù)都可以看到其他未提交的事務(wù)的執(zhí)行結(jié)果。只能防止第一類更新丟失,不能解決臟讀,可重復(fù)讀,幻讀,所以很少應(yīng)用于實際項目。

          讀已提交

          讀已提交(Read Committed), 在該隔離級別下,一個事務(wù)的更新操作結(jié)果只有在該事務(wù)提交之后,另一個事務(wù)才可能讀取到同一筆數(shù)據(jù)更新后的結(jié)果。可以防止臟讀和第一類更新丟失,但是不能解決可重復(fù)讀和幻讀的問題。

          可重復(fù)讀

          可重復(fù)讀(Repeatable Read),MySQL默認(rèn)的隔離級別。在該隔離級別下,一個事務(wù)多次讀同一個數(shù)據(jù),在這個事務(wù)還沒結(jié)束時,其他事務(wù)不能訪問該數(shù)據(jù)(包括了讀寫),這樣就可以在同一個事務(wù)內(nèi)兩次讀到的數(shù)據(jù)是一樣的。可以防止臟讀、不可重復(fù)讀、第一類更新丟失、第二類更新丟失的問題,不過還是會出現(xiàn)幻讀。

          串行化

          串行化(Serializable),這是最高的隔離級別。它要求事務(wù)序列化執(zhí)行,事務(wù)只能一個接著一個地執(zhí)行,不能并發(fā)執(zhí)行。在這個級別,可以解決上面提到的所有并發(fā)問題,但可能導(dǎo)致大量的超時現(xiàn)象和鎖競爭,通常不會用這個隔離級別。

          總結(jié)

          下面我們對事務(wù)的隔離級別和對并發(fā)問題的解決情況,請看下圖:

          這篇文章就講到這里了,感謝大家的閱讀,希望看完大家能有所收獲!



          別說你還沒監(jiān)控過 JVM,這種缺失得馬上補

          2021-04-19

          大白話詳解5種網(wǎng)絡(luò)IO模型

          2021-04-17

          為“應(yīng)付”面試,必須了解的MySQL三種日志

          2021-04-16

          使用 MyBatis-Plus 不用 Lambda 封裝,那你的使用姿勢不對

          2021-04-16


          瀏覽 41
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  大香蕉国产在线一区 | 国产精品V | 成人在线精品 | 婷婷五月丁香综合 | www.久久精品视频 |