2023-08-09 18:21:46來源:Java中文社群
幻讀是 MySQL 中一個(gè)非常普遍,且面試中經(jīng)常被問到的問題,如果你還搞不懂什么是幻讀?什么是 MVCC?以及 MySQL 中的鎖?那么請(qǐng)好好收藏和閱讀本篇文章,因?yàn)樗浅V匾?/p>
(相關(guān)資料圖)
在 MySQL 中,RR 代表 Repeatable Read(可重復(fù)讀),是數(shù)據(jù)庫事務(wù)隔離級(jí)別中的一種,它的特性是保證同一個(gè)事務(wù)中,多次讀取同一條記錄時(shí),讀取到的數(shù)據(jù)都是一致的。它也是 MySQL 默認(rèn)的事務(wù)隔離級(jí)別。
MVCC隔離級(jí)別是數(shù)據(jù)庫管理系統(tǒng)為了處理并發(fā)訪問時(shí),控制事務(wù)之間相互影響的程度而定義的一組規(guī)則。
MVCC(Multi-Version Concurrency Control,多版本并發(fā)控制)是一種并發(fā)控制機(jī)制,用于在數(shù)據(jù)庫系統(tǒng)中處理并發(fā)讀寫操作時(shí)保持?jǐn)?shù)據(jù)的一致性和隔離性(主要是用來解決幻讀問題的)。MVCC 通過在每個(gè)數(shù)據(jù)行上保存多個(gè)版本的數(shù)據(jù)來實(shí)現(xiàn)并發(fā)讀取和寫入的一致性。
MVCC 的核心思想是將每個(gè)事務(wù)的讀操作與寫操作解耦,通過保存數(shù)據(jù)的歷史版本來實(shí)現(xiàn)并發(fā)控制。每個(gè)事務(wù)在開始時(shí)會(huì)創(chuàng)建一個(gè)讀視圖(Read View),用于確定在事務(wù)開始時(shí)可見的數(shù)據(jù)版本。讀視圖包含一個(gè)事務(wù)開始時(shí)的系統(tǒng)版本號(hào),用于與數(shù)據(jù)行的版本號(hào)進(jìn)行比較,以確定數(shù)據(jù)行是否對(duì)事務(wù)可見。
在 MVCC 中,當(dāng)一個(gè)事務(wù)執(zhí)行寫操作時(shí),會(huì)生成一個(gè)新的數(shù)據(jù)版本,并將舊版本的數(shù)據(jù)保存在回滾日志(Undo Log)中。這樣,其他事務(wù)在讀取數(shù)據(jù)時(shí)仍然可以訪問到舊版本的數(shù)據(jù),從而避免了幻讀問題。
MVCC 工作流程如下:
讀操作:當(dāng)一個(gè)事務(wù)執(zhí)行 SELECT 語句時(shí),會(huì)根據(jù)讀視圖的系統(tǒng)版本號(hào)和數(shù)據(jù)行的版本號(hào)進(jìn)行比較,只讀取在事務(wù)開始之前已經(jīng)提交的數(shù)據(jù)行。這樣,即使其他事務(wù)正在并發(fā)地插入或刪除數(shù)據(jù),事務(wù)仍然可以讀取到一致的數(shù)據(jù)。寫操作:當(dāng)一個(gè)事務(wù)執(zhí)行 INSERT、UPDATE 或 DELETE 語句時(shí),會(huì)生成新的數(shù)據(jù)版本,并將舊版本的數(shù)據(jù)保存在回滾日志中。這樣,其他事務(wù)在讀取數(shù)據(jù)時(shí)仍然可以訪問到舊版本的數(shù)據(jù),從而避免了幻讀問題。MVCC 機(jī)制在數(shù)據(jù)庫系統(tǒng)中廣泛應(yīng)用,特別是在支持事務(wù)的存儲(chǔ)引擎中,如 MySQL 的 InnoDB 引擎。它通過解耦讀操作和寫操作,提供了高并發(fā)性能和數(shù)據(jù)一致性,使得多個(gè)事務(wù)可以同時(shí)讀取和修改數(shù)據(jù)庫,而不會(huì)相互干擾。
RR + MVCC 有幻讀問題嗎?在 MySQL 中,即使是RR 隔離級(jí)別(可重復(fù)讀),雖然它通過 MVCC 消除了絕大部分幻讀問題,但依舊存在部分幻讀問題,所以 RR 隔離級(jí)別存在幻讀問題,而 MVCC 也沒有徹底解決幻讀問題。
幻讀問題演示在 RR 隔離級(jí)別中存在兩種讀操作:
快照讀:數(shù)據(jù)庫中一種讀取數(shù)據(jù)的方式,它基于事務(wù)開始時(shí)的一個(gè)一致性快照來讀取數(shù)據(jù)。快照讀可以提供事務(wù)開始時(shí)的數(shù)據(jù)視圖,即使在事務(wù)執(zhí)行期間其他事務(wù)對(duì)數(shù)據(jù)進(jìn)行了修改,也不會(huì)影響快照讀取到的數(shù)據(jù)。簡(jiǎn)單理解,快照讀就是事務(wù)開啟時(shí)創(chuàng)建一個(gè)緩存,之后的查詢都會(huì)從這個(gè)緩存中獲取數(shù)據(jù)。當(dāng)前讀:數(shù)據(jù)庫中一種讀取數(shù)據(jù)的方式,它讀取最新提交的數(shù)據(jù),而不是基于事務(wù)開始時(shí)的一致性快照。所以,在 RR 隔離級(jí)別中 MVCC 通過快照讀的方式解決了大部分幻讀問題,但如果 RR 隔離級(jí)別存在當(dāng)前讀(使用 select ... for update 實(shí)現(xiàn)),那么此時(shí)也會(huì)發(fā)生幻讀問題,比如以下執(zhí)行過程:
如何徹底解決幻讀?想要徹底解決幻讀問題,有兩個(gè)方案:
使用串行化(Serializable)隔離級(jí)別:官方推薦方案,但這種解決方案,并發(fā)性能比較低。RR + 鎖:使用 RR 隔離級(jí)別,但在事務(wù)開啟之后立即加鎖,如下圖所示:事務(wù)一開啟之后就加鎖,之后其他事務(wù)在操作此表的相關(guān)數(shù)據(jù)時(shí),就只能等待鎖釋放(事務(wù)一提交或回滾鎖自動(dòng)釋放)。小結(jié)在可重復(fù)讀級(jí)別中,MySQL 雖然使用 MVCC 解決了大部分幻讀問題,但在當(dāng)前讀的操作中依然有幻讀問題,此時(shí)可以通過加鎖,或升級(jí)隔離級(jí)別為串行化來解決幻讀問題。
關(guān)鍵詞:
幻讀是MySQL中一個(gè)非常普遍,且面試中經(jīng)常被問到的問題,如果你還搞不
App8月9日消息,無錫完成今年第四批次住宅用地出讓。9宗地塊全部以底價(jià)
正式掛牌后的國(guó)家金融監(jiān)督管理總局蘇州監(jiān)管分局開出1號(hào)罰單,劍指渤海
擴(kuò)大光纖的存在已成為全球多個(gè)國(guó)家的首要任務(wù)。了解這些電纜如何突然流
8月9日消息,據(jù)財(cái)聯(lián)社報(bào)道,中央網(wǎng)信辦網(wǎng)絡(luò)安全協(xié)調(diào)局副局長(zhǎng)羅鋒盈今日
大家好我是小蝌蚪,熊貓雙俠,關(guān)于熊貓雙俠的基本詳情介紹很多人還不知
據(jù)中國(guó)駐法蘭克??傤I(lǐng)館官網(wǎng)消息,根據(jù)工作安排,自2023年8月9日起至20
如今,人工智能技術(shù)的迅猛發(fā)展給各個(gè)領(lǐng)域都帶來了前所未有的變革和進(jìn)步
云服務(wù)的采用正在上升,企業(yè)出于多種原因正在快速采用多云戰(zhàn)略,例如更
嗨!在本期分享中,我將介紹一些超級(jí)實(shí)用的ai工具,無論您是對(duì)AI感興趣
AI正在改變我們做幾乎所有事情的方式——無論我們走到哪里,機(jī)器都在執(zhí)
“當(dāng)你還在大熱天擠地鐵去市區(qū)圖書館人擠人、花三四十元點(diǎn)一杯摩卡蹭咖
A股三大指數(shù)縮量調(diào)整,截至收盤,滬指跌0 49%,深成指跌0 53%,北證50
近幾年,網(wǎng)絡(luò)金融詐騙層出不窮,讓人防不勝防,稍不留神就會(huì)掉入不法分
僅有1名監(jiān)督人員、1名招標(biāo)人代表、1名招標(biāo)代理人員坐在開標(biāo)室電腦前,