-
當(dāng)前位置:首頁 > 創(chuàng)意學(xué)院 > 技術(shù) > 專題列表 > 正文
可重復(fù)讀為什么解決不了幻讀(可重復(fù)讀為什么會出現(xiàn)幻讀)
大家好!今天讓創(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
本文目錄:
一、數(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ā)生了幻覺一樣,這就叫幻讀。
三者關(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ù)造成的。
以上就是關(guān)于可重復(fù)讀為什么解決不了幻讀相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會為您講解更多精彩的知識和內(nèi)容。
推薦閱讀:
可重復(fù)讀為什么解決不了幻讀(可重復(fù)讀為什么會出現(xiàn)幻讀)
景觀設(shè)計(jì)圖哪里可以找到(景觀設(shè)計(jì)圖哪里可以找到呢)
猜你喜歡
知道官方網(wǎng)頁登錄入口(官網(wǎng)登錄入口)
互聯(lián)網(wǎng)業(yè)務(wù)數(shù)據(jù)分析(互聯(lián)網(wǎng)業(yè)務(wù)數(shù)據(jù)分析第12期)
windows10搜索欄無法輸入(win10搜索欄不能輸入)
seo網(wǎng)站推廣技術(shù)(seo網(wǎng)站推廣技術(shù)有哪些)
大量微信群推廣代發(fā)廣告(代發(fā)微信群廣告10元)
電腦刷新速度慢怎么調(diào)(電腦刷新速度慢怎么調(diào)節(jié))