-
當前位置:首頁 > 創(chuàng)意學院 > 技術 > 專題列表 > 正文
可重復讀為什么解決不了幻讀(可重復讀為什么會出現幻讀)
大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關于可重復讀為什么解決不了幻讀的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。
開始之前先推薦一個非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等
只需要輸入關鍵詞,就能返回你想要的內容,越精準,寫出的就越詳細,有微信小程序端、在線網頁版、PC客戶端
創(chuàng)意嶺作為行業(yè)內優(yōu)秀的企業(yè),服務客戶遍布全球各地,如需了解SEO相關業(yè)務請撥打電話175-8598-2043,或添加微信:1454722008
本文目錄:
一、數據庫的幻讀什么意思???
幻讀:是指兩次查詢結果集不一樣了。比如:
兩個并發(fā)事務A、B。在T1這個時刻,事務A通過篩選條件獲取到的記錄是10條。此時并發(fā)事務B往數據庫插入一條滿足事務A查詢條件的記錄。這時A還沒有結束,在事務內再次獲取數據時以相同的條件篩選,結果篩選出了11條記錄。這就是幻讀。
你可以這樣理解:
臟讀關注的是當前獲得的結果與數據庫結果不一樣,數據不同。
不可重復讀關注的同一事務內兩次讀取,但數據不同。
以上兩個都是同一結果集。
而幻讀強調的是,結果集變了。
幻讀造成的原因是,共享鎖并不能鎖住我篩選的結果集以外的數據,即便你開啟了可重復讀,想要避免的話,可以更改事務隔離級別。
二、mysql如何解決幻讀
幻讀是指:在一個事務中,讀取到了其他已經提交的事務插入的數據行。
MySQL在解決臟讀、不可重復的讀時候,使用了MVCC一致性視圖,同時配合行鎖來解決。
至于幻讀的解決方式,MySQL引入了臨鍵鎖,通過間隙鎖可以避免在兩個行之間插入數據,從而避免了一個事務在讀取的過程中,讀取到其他事務插入的數據行。
三、大白話講解臟寫、臟讀、可重復讀和幻讀
當多個事務并發(fā)執(zhí)行的時候,會導致什么問題?
我們知道,執(zhí)行sql是在buffer pool中對數據進行查詢或者修改。如若多個事務同時更新一行數據會出現什么問題?
當事務A和事務B同時去更新同一行數據時,事務A先更新,事務B后更新。
那么此時,undo log就會記錄了事務A所改數據的舊值,假設舊值為 null。隨后事務B也對該行數據進行了更新,覆蓋掉A更新的值。此時事務A突然發(fā)生回滾,那么就會根據它的undo log進行回滾。
事務A進行了回滾,那么該數據的值就變成了更新前的null值。
然而,事務B并不知道此事,發(fā)現自己更新的值沒有了。這就是 臟寫 。
本質上,就是一個事務修改了另外一個沒提交的事務的值(沒提交有可能回滾),而導致有可能數據前后不一致的問題。
同樣有事務A和事務B。事務A去更新了一行數據,事務B剛好查詢到了該行數據,此時事務B拿到的值為A更新的值。
事務B拿到值后便去業(yè)務系統(tǒng)進行各種業(yè)務邏輯處理等等,這時,事務A突然回滾了,又把undo log的值回滾到該行數據。緊接著事務B再次查詢該行數據的時候,發(fā)現前后的值不一樣。這就是 臟讀 。
本質上,就是一個事務查詢到了另個一個未提交的事務的值,而導致有可能數據前后不一致的問題。
在避免臟讀的前提下,還有可能出現的 不可重復讀 。
這類情況是在什么場景下發(fā)生的呢?
假設,有一個前提,事務B在更新某行數據,但暫未提交,在未提交事務的時間里,事務A是讀不到該行數據的。必須等事務B提交了,事務A才能讀取到它修改的值。這樣就可以避免臟讀。
這時,假設事務A第一次查詢到的值為A值。
事務B把該行數據的值改為B值并立即提交事務。而事務A尚未提交事務,在事務執(zhí)行期間進行第二次查詢,所以事務A第二次查詢到的值為B值。
緊接著事務C再次更新數據為C值,并提交了事務。此時,事務A在未提交事務的情況下,進行第三次查詢,查到的值為C。
不可重復讀就是以上這種情況,事務A未提交事務,每次讀到的數據可能都不一樣。
通過以上分析,那可重復讀,就很好理解了。即希望,事務A每次讀到的值都是A值。
假設事務A需要多次批量查詢數據,第一次查詢到了十條數據
此時事務B往表里插入了幾條數據,且B提交了事務,那么此時,就會多出幾行數據
接著事務A再次進行查詢時,由于事務B的提交,導致事務A查詢多出來了幾條數據
這樣就出現了和查詢第一次沒見到的數據,就是 幻讀 。
本質上,就是一個事務用一樣的sql進行多次查詢,每次查詢到沒見過的數據。
四、臟讀 幻讀 不可重復讀
1、臟讀:事務A讀取了事務B更新的數據,然后B回滾操作咐睜,那么A讀取到的數據是臟數據。
2、不可重復讀:事務A多次讀取同一數據,事務B在事務A多次讀取的過程中,對數據作了更新并提交,導致事務A多次讀取同一數據時,結果不一致。
3、幻讀:系統(tǒng)管理員A將數據庫中所有學生的成績從具體分數改為ABCDE等級,但是系統(tǒng)管沒卜理員B就在這個時候插入了一條具體分數的記錄,當系統(tǒng)管理員A改結束后發(fā)現還有一條記錄沒有改過來,就好像發(fā)生了幻覺一樣,這就叫幻讀。
三者關系:
不可重復讀(Non-repeatable Reads):一個事務對同一行數據重復讀取兩次,但是卻得到了不同的結果。
包括以下情況:
(1)虛讀:事務T1讀取某一數據后,事務T2對其做了修改,當事務T1再次讀該數據時得到與前一次不同的值。
(2) 幻讀(Phantom Reads):事務在操作過程中進行兩次查詢,第二次查詢的結果包含了第一次查詢中未出現的數據或者缺少了第一次枯簡穗查詢中出現的數據(這里并不要求兩次查詢的SQL語句相同)。這是因為在兩次查詢過程中有另外一個事務插入數據造成的。
以上就是關于可重復讀為什么解決不了幻讀相關問題的回答。希望能幫到你,如有更多相關問題,您也可以聯系我們的客服進行咨詢,客服也會為您講解更多精彩的知識和內容。
推薦閱讀: