HOME 首頁
SERVICE 服務(wù)產(chǎn)品
XINMEITI 新媒體代運(yùn)營
CASE 服務(wù)案例
NEWS 熱點(diǎn)資訊
ABOUT 關(guān)于我們
CONTACT 聯(lián)系我們
創(chuàng)意嶺
讓品牌有溫度、有情感
專注品牌策劃15年

    可重復(fù)讀為什么解決不了幻讀(可重復(fù)讀為什么會出現(xiàn)幻讀)

    發(fā)布時間:2023-04-08 16:35:33     稿源: 創(chuàng)意嶺    閱讀: 56        

    大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于可重復(fù)讀為什么解決不了幻讀的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。

    開始之前先推薦一個非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計(jì)劃、工作報告、論文、代碼、作文、做題和對話答疑等等

    只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁版、PC客戶端

    官網(wǎng):https://ai.de1919.com。

    創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶遍布全球各地,如需了解SEO相關(guān)業(yè)務(wù)請撥打電話175-8598-2043,或添加微信:1454722008

    本文目錄:

    可重復(fù)讀為什么解決不了幻讀(可重復(fù)讀為什么會出現(xiàn)幻讀)

    一、數(shù)據(jù)庫的幻讀什么意思???

    幻讀:是指兩次查詢結(jié)果集不一樣了。比如:

    兩個并發(fā)事務(wù)A、B。在T1這個時刻,事務(wù)A通過篩選條件獲取到的記錄是10條。此時并發(fā)事務(wù)B往數(shù)據(jù)庫插入一條滿足事務(wù)A查詢條件的記錄。這時A還沒有結(jié)束,在事務(wù)內(nèi)再次獲取數(shù)據(jù)時以相同的條件篩選,結(jié)果篩選出了11條記錄。這就是幻讀。

    你可以這樣理解:

    臟讀關(guān)注的是當(dāng)前獲得的結(jié)果與數(shù)據(jù)庫結(jié)果不一樣,數(shù)據(jù)不同。

    不可重復(fù)讀關(guān)注的同一事務(wù)內(nèi)兩次讀取,但數(shù)據(jù)不同。

    以上兩個都是同一結(jié)果集。

    而幻讀強(qiáng)調(diào)的是,結(jié)果集變了。

    幻讀造成的原因是,共享鎖并不能鎖住我篩選的結(jié)果集以外的數(shù)據(jù),即便你開啟了可重復(fù)讀,想要避免的話,可以更改事務(wù)隔離級別。

    二、mysql如何解決幻讀

    幻讀是指:在一個事務(wù)中,讀取到了其他已經(jīng)提交的事務(wù)插入的數(shù)據(jù)行。

    MySQL在解決臟讀、不可重復(fù)的讀時候,使用了MVCC一致性視圖,同時配合行鎖來解決。

    至于幻讀的解決方式,MySQL引入了臨鍵鎖,通過間隙鎖可以避免在兩個行之間插入數(shù)據(jù),從而避免了一個事務(wù)在讀取的過程中,讀取到其他事務(wù)插入的數(shù)據(jù)行。

    三、大白話講解臟寫、臟讀、可重復(fù)讀和幻讀

    當(dāng)多個事務(wù)并發(fā)執(zhí)行的時候,會導(dǎo)致什么問題?

    我們知道,執(zhí)行sql是在buffer pool中對數(shù)據(jù)進(jìn)行查詢或者修改。如若多個事務(wù)同時更新一行數(shù)據(jù)會出現(xiàn)什么問題?

    當(dāng)事務(wù)A和事務(wù)B同時去更新同一行數(shù)據(jù)時,事務(wù)A先更新,事務(wù)B后更新。

    那么此時,undo log就會記錄了事務(wù)A所改數(shù)據(jù)的舊值,假設(shè)舊值為 null。隨后事務(wù)B也對該行數(shù)據(jù)進(jìn)行了更新,覆蓋掉A更新的值。此時事務(wù)A突然發(fā)生回滾,那么就會根據(jù)它的undo log進(jìn)行回滾。

    事務(wù)A進(jìn)行了回滾,那么該數(shù)據(jù)的值就變成了更新前的null值。

    然而,事務(wù)B并不知道此事,發(fā)現(xiàn)自己更新的值沒有了。這就是 臟寫 。

    本質(zhì)上,就是一個事務(wù)修改了另外一個沒提交的事務(wù)的值(沒提交有可能回滾),而導(dǎo)致有可能數(shù)據(jù)前后不一致的問題。

    同樣有事務(wù)A和事務(wù)B。事務(wù)A去更新了一行數(shù)據(jù),事務(wù)B剛好查詢到了該行數(shù)據(jù),此時事務(wù)B拿到的值為A更新的值。

    事務(wù)B拿到值后便去業(yè)務(wù)系統(tǒng)進(jìn)行各種業(yè)務(wù)邏輯處理等等,這時,事務(wù)A突然回滾了,又把undo log的值回滾到該行數(shù)據(jù)。緊接著事務(wù)B再次查詢該行數(shù)據(jù)的時候,發(fā)現(xiàn)前后的值不一樣。這就是 臟讀 。

    本質(zhì)上,就是一個事務(wù)查詢到了另個一個未提交的事務(wù)的值,而導(dǎo)致有可能數(shù)據(jù)前后不一致的問題。

    在避免臟讀的前提下,還有可能出現(xiàn)的 不可重復(fù)讀 。

    這類情況是在什么場景下發(fā)生的呢?

    假設(shè),有一個前提,事務(wù)B在更新某行數(shù)據(jù),但暫未提交,在未提交事務(wù)的時間里,事務(wù)A是讀不到該行數(shù)據(jù)的。必須等事務(wù)B提交了,事務(wù)A才能讀取到它修改的值。這樣就可以避免臟讀。

    這時,假設(shè)事務(wù)A第一次查詢到的值為A值。

    事務(wù)B把該行數(shù)據(jù)的值改為B值并立即提交事務(wù)。而事務(wù)A尚未提交事務(wù),在事務(wù)執(zhí)行期間進(jìn)行第二次查詢,所以事務(wù)A第二次查詢到的值為B值。

    緊接著事務(wù)C再次更新數(shù)據(jù)為C值,并提交了事務(wù)。此時,事務(wù)A在未提交事務(wù)的情況下,進(jìn)行第三次查詢,查到的值為C。

    不可重復(fù)讀就是以上這種情況,事務(wù)A未提交事務(wù),每次讀到的數(shù)據(jù)可能都不一樣。

    通過以上分析,那可重復(fù)讀,就很好理解了。即希望,事務(wù)A每次讀到的值都是A值。

    假設(shè)事務(wù)A需要多次批量查詢數(shù)據(jù),第一次查詢到了十條數(shù)據(jù)

    此時事務(wù)B往表里插入了幾條數(shù)據(jù),且B提交了事務(wù),那么此時,就會多出幾行數(shù)據(jù)

    接著事務(wù)A再次進(jìn)行查詢時,由于事務(wù)B的提交,導(dǎo)致事務(wù)A查詢多出來了幾條數(shù)據(jù)

    這樣就出現(xiàn)了和查詢第一次沒見到的數(shù)據(jù),就是 幻讀 。

    本質(zhì)上,就是一個事務(wù)用一樣的sql進(jìn)行多次查詢,每次查詢到?jīng)]見過的數(shù)據(jù)。

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

    1、臟讀:事務(wù)A讀取了事務(wù)B更新的數(shù)據(jù),然后B回滾操作咐睜,那么A讀取到的數(shù)據(jù)是臟數(shù)據(jù)。

    2、不可重復(fù)讀:事務(wù)A多次讀取同一數(shù)據(jù),事務(wù)B在事務(wù)A多次讀取的過程中,對數(shù)據(jù)作了更新并提交,導(dǎo)致事務(wù)A多次讀取同一數(shù)據(jù)時,結(jié)果不一致。

    3、幻讀:系統(tǒng)管理員A將數(shù)據(jù)庫中所有學(xué)生的成績從具體分?jǐn)?shù)改為ABCDE等級,但是系統(tǒng)管沒卜理員B就在這個時候插入了一條具體分?jǐn)?shù)的記錄,當(dāng)系統(tǒng)管理員A改結(jié)束后發(fā)現(xiàn)還有一條記錄沒有改過來,就好像發(fā)生了幻覺一樣,這就叫幻讀。

    可重復(fù)讀為什么解決不了幻讀(可重復(fù)讀為什么會出現(xiàn)幻讀)

    三者關(guān)系:

    不可重復(fù)讀(Non-repeatable Reads):一個事務(wù)對同一行數(shù)據(jù)重復(fù)讀取兩次,但是卻得到了不同的結(jié)果。

    包括以下情況:

    (1)虛讀:事務(wù)T1讀取某一數(shù)據(jù)后,事務(wù)T2對其做了修改,當(dāng)事務(wù)T1再次讀該數(shù)據(jù)時得到與前一次不同的值。

    (2) 幻讀(Phantom Reads):事務(wù)在操作過程中進(jìn)行兩次查詢,第二次查詢的結(jié)果包含了第一次查詢中未出現(xiàn)的數(shù)據(jù)或者缺少了第一次枯簡穗查詢中出現(xiàn)的數(shù)據(jù)(這里并不要求兩次查詢的SQL語句相同)。這是因?yàn)樵趦纱尾樵冞^程中有另外一個事務(wù)插入數(shù)據(jù)造成的。

    可重復(fù)讀為什么解決不了幻讀(可重復(fù)讀為什么會出現(xiàn)幻讀)

    以上就是關(guān)于可重復(fù)讀為什么解決不了幻讀相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會為您講解更多精彩的知識和內(nèi)容。


    推薦閱讀:

    可重復(fù)讀為什么解決不了幻讀(可重復(fù)讀為什么會出現(xiàn)幻讀)

    云閃付注銷后多久可重新注冊(云閃付注銷后多久可重新注冊呢)

    可重復(fù)使用怎么讀(可重復(fù)使用的英語怎么寫)

    景觀設(shè)計(jì)圖哪里可以找到(景觀設(shè)計(jì)圖哪里可以找到呢)

    杭州廣告拍攝品牌(杭州廣告拍攝品牌排行榜)