偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

RR有幻讀問(wèn)題嗎?MVCC能否解決幻讀?

數(shù)據(jù)庫(kù) MySQL
1. 數(shù)據(jù)庫(kù)中一種讀取數(shù)據(jù)的方式,它基于事務(wù)開(kāi)始時(shí)的一個(gè)一致性快照來(lái)讀取數(shù)據(jù)。快照讀可以提供事務(wù)開(kāi)始時(shí)的數(shù)據(jù)視圖,即使在事務(wù)執(zhí)行期間其他事務(wù)對(duì)數(shù)據(jù)進(jìn)行了修改,也不會(huì)影響快照讀取到的數(shù)據(jù)。簡(jiǎn)單理解,快照讀就是事務(wù)開(kāi)啟時(shí)創(chuàng)建一個(gè)緩存,之后的查詢都會(huì)從這個(gè)緩存中獲取數(shù)據(jù)。

幻讀是 MySQL 中一個(gè)非常普遍,且面試中經(jīng)常被問(wèn)到的問(wèn)題,如果你還搞不懂什么是幻讀?什么是 MVCC?以及 MySQL 中的鎖?那么請(qǐng)好好收藏和閱讀本篇文章,因?yàn)樗浅V匾?/p>

RR 隔離級(jí)別

在 MySQL 中,RR 代表 Repeatable Read(可重復(fù)讀),是數(shù)據(jù)庫(kù)事務(wù)隔離級(jí)別中的一種,它的特性是保證同一個(gè)事務(wù)中,多次讀取同一條記錄時(shí),讀取到的數(shù)據(jù)都是一致的。它也是 MySQL 默認(rèn)的事務(wù)隔離級(jí)別。

隔離級(jí)別是數(shù)據(jù)庫(kù)管理系統(tǒng)為了處理并發(fā)訪問(wèn)時(shí),控制事務(wù)之間相互影響的程度而定義的一組規(guī)則。

MVCC

MVCC(Multi-Version Concurrency Control,多版本并發(fā)控制)是一種并發(fā)控制機(jī)制,用于在數(shù)據(jù)庫(kù)系統(tǒng)中處理并發(fā)讀寫(xiě)操作時(shí)保持?jǐn)?shù)據(jù)的一致性和隔離性(主要是用來(lái)解決幻讀問(wèn)題的)。MVCC 通過(guò)在每個(gè)數(shù)據(jù)行上保存多個(gè)版本的數(shù)據(jù)來(lái)實(shí)現(xiàn)并發(fā)讀取和寫(xiě)入的一致性。

MVCC 的核心思想是將每個(gè)事務(wù)的讀操作與寫(xiě)操作解耦,通過(guò)保存數(shù)據(jù)的歷史版本來(lái)實(shí)現(xiàn)并發(fā)控制。每個(gè)事務(wù)在開(kāi)始時(shí)會(huì)創(chuàng)建一個(gè)讀視圖(Read View),用于確定在事務(wù)開(kāi)始時(shí)可見(jiàn)的數(shù)據(jù)版本。讀視圖包含一個(gè)事務(wù)開(kāi)始時(shí)的系統(tǒng)版本號(hào),用于與數(shù)據(jù)行的版本號(hào)進(jìn)行比較,以確定數(shù)據(jù)行是否對(duì)事務(wù)可見(jiàn)。

在 MVCC 中,當(dāng)一個(gè)事務(wù)執(zhí)行寫(xiě)操作時(shí),會(huì)生成一個(gè)新的數(shù)據(jù)版本,并將舊版本的數(shù)據(jù)保存在回滾日志(Undo Log)中。這樣,其他事務(wù)在讀取數(shù)據(jù)時(shí)仍然可以訪問(wèn)到舊版本的數(shù)據(jù),從而避免了幻讀問(wèn)題。

MVCC 工作流程如下:

  1. 讀操作:當(dāng)一個(gè)事務(wù)執(zhí)行 SELECT 語(yǔ)句時(shí),會(huì)根據(jù)讀視圖的系統(tǒng)版本號(hào)和數(shù)據(jù)行的版本號(hào)進(jìn)行比較,只讀取在事務(wù)開(kāi)始之前已經(jīng)提交的數(shù)據(jù)行。這樣,即使其他事務(wù)正在并發(fā)地插入或刪除數(shù)據(jù),事務(wù)仍然可以讀取到一致的數(shù)據(jù)。
  2. 寫(xiě)操作:當(dāng)一個(gè)事務(wù)執(zhí)行 INSERT、UPDATE 或 DELETE 語(yǔ)句時(shí),會(huì)生成新的數(shù)據(jù)版本,并將舊版本的數(shù)據(jù)保存在回滾日志中。這樣,其他事務(wù)在讀取數(shù)據(jù)時(shí)仍然可以訪問(wèn)到舊版本的數(shù)據(jù),從而避免了幻讀問(wèn)題。

MVCC 機(jī)制在數(shù)據(jù)庫(kù)系統(tǒng)中廣泛應(yīng)用,特別是在支持事務(wù)的存儲(chǔ)引擎中,如 MySQL 的 InnoDB 引擎。它通過(guò)解耦讀操作和寫(xiě)操作,提供了高并發(fā)性能和數(shù)據(jù)一致性,使得多個(gè)事務(wù)可以同時(shí)讀取和修改數(shù)據(jù)庫(kù),而不會(huì)相互干擾。

RR + MVCC 有幻讀問(wèn)題嗎?

在 MySQL 中,即使是RR 隔離級(jí)別(可重復(fù)讀),雖然它通過(guò) MVCC 消除了絕大部分幻讀問(wèn)題,但依舊存在部分幻讀問(wèn)題,所以 RR 隔離級(jí)別存在幻讀問(wèn)題,而 MVCC 也沒(méi)有徹底解決幻讀問(wèn)題。

幻讀問(wèn)題演示

在 RR 隔離級(jí)別中存在兩種讀操作:

  1. 快照讀:數(shù)據(jù)庫(kù)中一種讀取數(shù)據(jù)的方式,它基于事務(wù)開(kāi)始時(shí)的一個(gè)一致性快照來(lái)讀取數(shù)據(jù)??煺兆x可以提供事務(wù)開(kāi)始時(shí)的數(shù)據(jù)視圖,即使在事務(wù)執(zhí)行期間其他事務(wù)對(duì)數(shù)據(jù)進(jìn)行了修改,也不會(huì)影響快照讀取到的數(shù)據(jù)。簡(jiǎn)單理解,快照讀就是事務(wù)開(kāi)啟時(shí)創(chuàng)建一個(gè)緩存,之后的查詢都會(huì)從這個(gè)緩存中獲取數(shù)據(jù)。
  2. 當(dāng)前讀:數(shù)據(jù)庫(kù)中一種讀取數(shù)據(jù)的方式,它讀取最新提交的數(shù)據(jù),而不是基于事務(wù)開(kāi)始時(shí)的一致性快照。

所以,在 RR 隔離級(jí)別中 MVCC 通過(guò)快照讀的方式解決了大部分幻讀問(wèn)題,但如果 RR 隔離級(jí)別存在當(dāng)前讀(使用 select ... for update 實(shí)現(xiàn)),那么此時(shí)也會(huì)發(fā)生幻讀問(wèn)題,比如以下執(zhí)行過(guò)程:圖片

如何徹底解決幻讀?

想要徹底解決幻讀問(wèn)題,有兩個(gè)方案:

  1. 使用串行化(Serializable)隔離級(jí)別:官方推薦方案,但這種解決方案,并發(fā)性能比較低。
  2. RR + 鎖:使用 RR 隔離級(jí)別,但在事務(wù)開(kāi)啟之后立即加鎖,如下圖所示:圖片事務(wù)一開(kāi)啟之后就加鎖,之后其他事務(wù)在操作此表的相關(guān)數(shù)據(jù)時(shí),就只能等待鎖釋放(事務(wù)一提交或回滾鎖自動(dòng)釋放)。

小結(jié)

在可重復(fù)讀級(jí)別中,MySQL 雖然使用 MVCC 解決了大部分幻讀問(wèn)題,但在當(dāng)前讀的操作中依然有幻讀問(wèn)題,此時(shí)可以通過(guò)加鎖,或升級(jí)隔離級(jí)別為串行化來(lái)解決幻讀問(wèn)題。

責(zé)任編輯:武曉燕 來(lái)源: Java中文社群
相關(guān)推薦

2021-08-26 06:58:15

Innodb RR隔離級(jí)別

2021-04-27 08:25:52

MVCC數(shù)據(jù)MySQL

2024-04-25 08:16:06

InnodbReadMVCC

2022-02-17 21:13:08

MySQL架構(gòu)體系

2022-06-30 08:00:00

MySQL關(guān)系數(shù)據(jù)庫(kù)開(kāi)發(fā)

2023-06-05 00:28:24

MySQL數(shù)據(jù)庫(kù)非鎖定讀

2021-04-20 19:21:50

臟讀MySQL幻讀

2019-05-28 13:50:27

MySQL幻讀數(shù)據(jù)庫(kù)

2024-05-13 11:46:33

MySQL數(shù)據(jù)庫(kù)

2024-09-02 00:00:00

MySQL幻讀數(shù)據(jù)

2019-12-24 14:50:01

MySQL可重復(fù)讀數(shù)據(jù)庫(kù)

2024-04-24 08:26:35

事務(wù)數(shù)據(jù)InnoDB

2021-11-30 06:56:59

MySQL幻讀查詢

2022-12-27 10:02:38

MVCC機(jī)制Innodb

2024-04-19 08:18:47

MySQLSQL隔離

2023-11-01 14:13:00

MySQL事務(wù)隔離級(jí)別

2019-03-21 09:06:00

數(shù)據(jù)庫(kù)復(fù)讀幻讀

2022-04-27 07:32:02

臟讀幻讀不可重復(fù)讀

2024-03-11 00:00:00

mysqlInnoDB幻讀

2022-01-03 07:18:05

臟讀幻讀 MySQL
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)