-
當前位置:首頁 > 創(chuàng)意學院 > 技術 > 專題列表 > 正文
可重復讀為什么解決不了幻讀(可重復讀為什么會出現(xiàn)幻讀)
大家好!今天讓創(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
本文目錄:
一、數(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ā)生了幻覺一樣,這就叫幻讀。
三者關系:
不可重復讀(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ù)造成的。
以上就是關于可重復讀為什么解決不了幻讀相關問題的回答。希望能幫到你,如有更多相關問題,您也可以聯(lián)系我們的客服進行咨詢,客服也會為您講解更多精彩的知識和內(nèi)容。
推薦閱讀:
可重復讀為什么解決不了幻讀(可重復讀為什么會出現(xiàn)幻讀)