成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

RR有幻讀問題嗎?MVCC能否解決幻讀?

數據庫 MySQL
1. 數據庫中一種讀取數據的方式,它基于事務開始時的一個一致性快照來讀取數據。快照讀可以提供事務開始時的數據視圖,即使在事務執行期間其他事務對數據進行了修改,也不會影響快照讀取到的數據。簡單理解,快照讀就是事務開啟時創建一個緩存,之后的查詢都會從這個緩存中獲取數據。

幻讀是 MySQL 中一個非常普遍,且面試中經常被問到的問題,如果你還搞不懂什么是幻讀?什么是 MVCC?以及 MySQL 中的鎖?那么請好好收藏和閱讀本篇文章,因為它非常重要。

RR 隔離級別

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

隔離級別是數據庫管理系統為了處理并發訪問時,控制事務之間相互影響的程度而定義的一組規則。

MVCC

MVCC(Multi-Version Concurrency Control,多版本并發控制)是一種并發控制機制,用于在數據庫系統中處理并發讀寫操作時保持數據的一致性和隔離性(主要是用來解決幻讀問題的)。MVCC 通過在每個數據行上保存多個版本的數據來實現并發讀取和寫入的一致性。

MVCC 的核心思想是將每個事務的讀操作與寫操作解耦,通過保存數據的歷史版本來實現并發控制。每個事務在開始時會創建一個讀視圖(Read View),用于確定在事務開始時可見的數據版本。讀視圖包含一個事務開始時的系統版本號,用于與數據行的版本號進行比較,以確定數據行是否對事務可見。

在 MVCC 中,當一個事務執行寫操作時,會生成一個新的數據版本,并將舊版本的數據保存在回滾日志(Undo Log)中。這樣,其他事務在讀取數據時仍然可以訪問到舊版本的數據,從而避免了幻讀問題。

MVCC 工作流程如下:

  1. 讀操作:當一個事務執行 SELECT 語句時,會根據讀視圖的系統版本號和數據行的版本號進行比較,只讀取在事務開始之前已經提交的數據行。這樣,即使其他事務正在并發地插入或刪除數據,事務仍然可以讀取到一致的數據。
  2. 寫操作:當一個事務執行 INSERT、UPDATE 或 DELETE 語句時,會生成新的數據版本,并將舊版本的數據保存在回滾日志中。這樣,其他事務在讀取數據時仍然可以訪問到舊版本的數據,從而避免了幻讀問題。

MVCC 機制在數據庫系統中廣泛應用,特別是在支持事務的存儲引擎中,如 MySQL 的 InnoDB 引擎。它通過解耦讀操作和寫操作,提供了高并發性能和數據一致性,使得多個事務可以同時讀取和修改數據庫,而不會相互干擾。

RR + MVCC 有幻讀問題嗎?

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

幻讀問題演示

在 RR 隔離級別中存在兩種讀操作:

  1. 快照讀:數據庫中一種讀取數據的方式,它基于事務開始時的一個一致性快照來讀取數據??煺兆x可以提供事務開始時的數據視圖,即使在事務執行期間其他事務對數據進行了修改,也不會影響快照讀取到的數據。簡單理解,快照讀就是事務開啟時創建一個緩存,之后的查詢都會從這個緩存中獲取數據。
  2. 當前讀:數據庫中一種讀取數據的方式,它讀取最新提交的數據,而不是基于事務開始時的一致性快照。

所以,在 RR 隔離級別中 MVCC 通過快照讀的方式解決了大部分幻讀問題,但如果 RR 隔離級別存在當前讀(使用 select ... for update 實現),那么此時也會發生幻讀問題,比如以下執行過程:圖片

如何徹底解決幻讀?

想要徹底解決幻讀問題,有兩個方案:

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

小結

在可重復讀級別中,MySQL 雖然使用 MVCC 解決了大部分幻讀問題,但在當前讀的操作中依然有幻讀問題,此時可以通過加鎖,或升級隔離級別為串行化來解決幻讀問題。

責任編輯:武曉燕 來源: Java中文社群
相關推薦

2021-08-26 06:58:15

Innodb RR隔離級別

2021-04-27 08:25:52

MVCC數據MySQL

2024-04-25 08:16:06

InnodbReadMVCC

2022-02-17 21:13:08

MySQL架構體系

2022-06-30 08:00:00

MySQL關系數據庫開發

2023-06-05 00:28:24

MySQL數據庫非鎖定讀

2021-04-20 19:21:50

臟讀MySQL幻讀

2019-05-28 13:50:27

MySQL幻讀數據庫

2024-05-13 11:46:33

MySQL數據庫

2024-09-02 00:00:00

MySQL幻讀數據

2019-12-24 14:50:01

MySQL可重復讀數據庫

2021-11-30 06:56:59

MySQL幻讀查詢

2024-04-24 08:26:35

事務數據InnoDB

2022-12-27 10:02:38

MVCC機制Innodb

2024-04-19 08:18:47

MySQLSQL隔離

2023-11-01 14:13:00

MySQL事務隔離級別

2019-03-21 09:06:00

數據庫復讀幻讀

2022-04-27 07:32:02

臟讀幻讀不可重復讀

2024-03-11 00:00:00

mysqlInnoDB幻讀

2023-12-27 18:16:39

MVCC隔離級別幻讀
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区三区国产好的精 | 欧美1区 | 日日干日日操 | 国产欧美精品一区二区 | 久久黄网 | 欧区一欧区二欧区三免费 | www.日韩系列 | 狠狠干美女 | 日韩精品一区二区三区中文字幕 | 亚洲欧洲一区 | 成人午夜免费在线视频 | 日韩精品在线网站 | 日韩精品成人 | 中文字幕一区二区三区在线视频 | 精品久久久久久久久久久久久久 | 久久久久久久久久爱 | 91久久国产综合久久 | 中文字幕a√ | 91免费版在线观看 | 免费中文字幕日韩欧美 | 国产精品99久久久久久久久久久久 | 992tv人人草 久久精品超碰 | 国产一区二区在线免费观看 | 99精品一区 | 一区二区三区欧美大片 | 婷婷综合在线 | 久久国产日本 | 视频一二区 | 久久精品久久久久久 | 欧美在线国产精品 | 成人免费精品 | 亚洲国产第一页 | 亚洲一区二区三区在线播放 | 国产小视频在线观看 | 狠狠色综合网站久久久久久久 | h视频网站在线观看 | 久久久久国产一区二区三区四区 | 日韩视频一区二区三区 | 亚洲一av | av片在线观看网站 | 精品国产乱码久久久久久闺蜜 |