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

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

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

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

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

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

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

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

    本文目錄:

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

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

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

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

    你可以這樣理解:

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

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

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

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

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

    二、mysql如何解決幻讀

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

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

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

    三、大白話講解臟寫、臟讀、可重復讀和幻讀

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

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

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

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

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

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

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

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

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

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

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

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

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

    這時,假設事務A第一次查詢到的值為A值。

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

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

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

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

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

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

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

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

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

    四、臟讀 幻讀 不可重復讀

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

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

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

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

    三者關系:

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

    包括以下情況:

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

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

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

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


    推薦閱讀:

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

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

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

    景觀設計圖哪里可以找到(景觀設計圖哪里可以找到呢)

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