多版本并發控制:MVCC的作用和基本原理

多版本并發控制:MVCC的作用和基本原理

  • 1、MVCC簡介
    • 1.1 快照讀與當前讀的區別
      • 1.1.1 快照讀
      • 1.1.2 當前讀
    • 1.2 數據庫的讀寫問題
    • 1.3 MVCC的作用
  • 2、MVCC實現原理之ReadView
    • 2.1 什么是ReadView
    • 2.2 ReadView的設計思路
    • 2.3 MVCC整體操作流程

1、MVCC簡介

1.1 快照讀與當前讀的區別

mysql在讀數據的場景下,根據是否加鎖分為了2種讀的方式:

1.1.1 快照讀

不加鎖的簡單的select都屬于快照讀,即不加鎖的非阻塞讀。比如:

SELECT * FROM students WHERE ...

之所以出現快照讀的情況,是基于提高并發性能的考慮,快照讀的實現是基于MVCC。他在很多情況下,避免了加鎖操作,降低了開銷。

1.1.2 當前讀

當前讀讀取的是記錄最新的數據。加鎖的SELECT,或者對數據進行增刪改查都會進行當前讀。比如:

SELECT * FROM student LOCK IN SHARE MODE;  # 共享鎖
SELECT * FROM student FOR UPDATE;  # 排他鎖
INSERT INTO student VALUES ...;  # 排他鎖
DELETE FROM student WHERE ...;  # 排他鎖
UPDATE student SET ...;  # 排他鎖

1.2 數據庫的讀寫問題

數據庫多事務場景下的讀-讀不會存在并發問題,寫-寫場景存在并發問題,因此一定需要加鎖。

讀-寫、或者寫-讀場景下如何處理?

方案一:讀操作也采用加鎖的方式。
比如,在銀行存款的事務中,需要先讀取賬戶余額,然后再進行存/取操作,最后寫入數據庫中。在這個過程中,是不希望其他事務在該事務還未結束的情況下訪問該余額。這種情況下,在讀取余額的時候就需要進行加鎖操作了。這樣就可以保證本次操作結束后的金額,一定是和預期一致的。

1.3 MVCC的作用

數據庫的讀寫問題,除了采用加鎖的方式解決,還可以通過MVCC的方式解決。

MVCC(Multiversion Concurrency Control)多版本并發控制,通過數據行的多個版本管理實現數據庫的并發控制。即查詢一些正在被另一個事務更新的數據行時,可以看到他們被更新之前的值,不用等待另一個事務釋放鎖。

所謂的MVCC,就是生成一個ReadView,通過ReadView找到符合條件的記錄版本(歷史版本由undo日志構建)。查詢語句只能讀到在生成ReadView之前已提交事務做的修改,不影響其他事務進行寫操作,因此可以解決讀寫問題。相比于加鎖的方式解決讀寫問題,可以大幅提高并發性能。

2、MVCC實現原理之ReadView

MVCC的實現依賴于:隱藏字段、Undo Log、Read View

undo日志版本鏈中索引記錄都包含2個必要的隱藏列:

  • trx_id:每次一個事務對某條索引記錄進行修改時,都會把該事務的事務id賦值給trx_id隱藏列。
  • roll_pointer:每次對某條索引記錄進行修改時,都會把舊版本寫入到undo日志中,這個隱藏列相當于一個指針,可以通過它來找到該記錄修改前的信息。

以下圖舉例,其中藍色部分為頁面的當前記錄,綠色部分為undo日志。
在這里插入圖片描述

2.1 什么是ReadView

多個事務對同一行記錄進行更新會產品多個歷史快照,這些歷史快照保存在undo log里。如果一個事務想要查詢這個行記錄,怎么判斷讀取哪個版本的記錄呢?這個時候就可以用上Readview了,它解決了多事務場景下的可見性的問題。

Readview就是事務在使用MVCC機制進行快照讀操作時產生的讀視圖。當事務啟動時,會生成數據庫系統當前的一個快照,Innodb為每個事務構造了一個數組,用來記錄并維護系統當前未提交事務的ID。

2.2 ReadView的設計思路

Readview要解決的核心問題是:判斷版本鏈中的哪個版本是當前事務可見的。

為此,Readview設計了4個核心字段:

  1. creator_trx_id:創建Readview的事務ID。只有對表做增刪改操作時才會分配事務ID,讀操作的事務ID默認值為0。
  2. trx_ids:表示生成Readview時,當前系統中未提交事務的事務id列表。
  3. up_limit_id:當前未提交事務列表中最小的事務id。
  4. low_limit_id:生成Readview時,系統應該分配給下一個事務的id值。

舉例:現在有id未1,2,3這3個事務,然后id為3的事務提交了。此時一個新的讀事務在生成Readview時,trx_ids的值是:[1,2],up_limit_id的值是1,low_limit_id的值是4。

有了Readview,在訪問某條記錄時,根據以下步驟判斷記錄的某個版本是否可見

  1. 如果被訪問版本的trx_id值與Readview中的creator_trx_id值相同:表明當前呢事務在訪問自己修改的記錄,所以該版本可以被當前事務訪問。
  2. 如果被訪問版本的trx_id值小于Readview中的up_limit_id值:表明生成該版本的事務在當前事務生成Readview之前就已經提交了,所以該版本可以被當前事務訪問。
  3. 如果被訪問版本的trx_id值大于等于Readview中的low_limit_id值:表明生成該版本的事務在當前事務生成Readview之后才開啟,所以該版本不可以被當前事務訪問。
  4. 如果被訪問版本的trx_id值在Readview中的up_limit_id值和low_limit_id值之間,需要判斷一下trx_id值是否在trx_ids列表中。
    1)如果在:說明創建Readview時,生成該版本的事務還未提交,該版本不可以被訪問。
    2)如果不在:說明創建Readview時,生成該版本的事務已被提交,該版本可以被訪問。

2.3 MVCC整體操作流程

查詢記錄時,MVCC操作流程如下。如果某個版本的數據對當前事務不可見的話,就順著版本鏈找下一個版本的數據,繼續按照流程進行判斷。

  1. 獲取事務自己的版本號,即事務ID
  2. 生成Readview
  3. 查詢數據,根據數據的版本號(trx_id)值按照2.2中的規則進行判斷
  4. 如果不符合2.2中Readview規則,從undo log中獲取歷史快照
  5. 循環執行,最后返回符合2.2中Readview規則中的數據。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/67128.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/67128.shtml
英文地址,請注明出處:http://en.pswp.cn/web/67128.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

神經網絡|(二)sigmoid神經元函數

【1】引言 在前序學習進程中,我們已經了解了基本的二元分類器和神經元的構成,文章學習鏈接為: 神經網絡|(一)加權平均法,感知機和神經元-CSDN博客 在此基礎上,我們認識到神經元本身在做二元分類,是一種非…

Qt中QVariant的使用

1.使用QVariant實現不同類型數據的相加 方法:通過type函數返回數值的類型,然后通過setValue來構造一個QVariant類型的返回值。 函數: QVariant mainPage::dataPlus(QVariant a, QVariant b) {QVariant ret;if ((a.type() QVariant::Int) &a…

BAHD酰基轉移酶對紫草素的手性催化-文獻精讀105

Two BAHD Acyltransferases Catalyze the Last Step in the Shikonin/Alkannin Biosynthetic Pathway 兩個BAHD酰基轉移酶催化了紫草素/左旋紫草素生物合成途徑中的最后一步 一個BAHD酰基轉移酶專門催化紫草素的酰基化,而另一個BAHD酰基轉移酶則僅催化紫草素的對映…

Avalonia+ReactiveUI跨平臺路由:打造絲滑UI交互的奇幻冒險

一、引言 在當今數字化時代,跨平臺應用開發已成為大勢所趨。開發者們迫切需要一種高效、靈活的方式,能夠讓應用程序在不同操作系統上無縫運行,為用戶提供一致的體驗。Avalonia 和 ReactiveUI 的組合,宛如一對天作之合的舞者&…

CLion開發Qt桌面

IDE:CLion Qt Qt版本:5.12 學習正點原子的嵌入式Linux開發板時,使用Qt Creator寫代碼不是很方便,遂嘗試使用CLion搭建Qt開發環境。 一、CLion的Qt環境搭建 1,配置工具鏈 找到Qt的安裝目錄,此處為E:\Tools\…

【學術會議-第五屆機械設計與仿真國際學術會議(MDS 2025) 】前端開發:技術與藝術的完美融合

重要信息 大會官網:www.icmds.net 大會時間:2025年02月28日-03月02日 大會地點:中國-大連 會議簡介 2025年第五屆機械設計與仿真國際學術會議(MDS 2025) 將于2025年02月28-3月02日在中國大連召開。MDS 2025將圍繞“機械設計”…

《DeepSeek R1:開源大模型的破局者》

驚爆!中國開源大模型震撼登場 在人工智能領域的激烈競爭中,一場震撼全球的技術革命正悄然發生。2025 年 1 月 20 日晚,一家來自中國的人工智能初創公司 ——DeepSeek(深度求索),如同一顆耀眼的新星&#x…

84,【8】BUUCTF WEB [羊城杯 2020]Blackcat

進入靶場 音樂硬控我3分鐘 回去看源碼 <?php // 檢查 POST 請求中是否包含 Black-Cat-Sheriff 和 One-ear 字段 // 如果任意一個字段為空&#xff0c;則輸出錯誤信息并終止腳本執行 if(empty($_POST[Black-Cat-Sheriff]) || empty($_POST[One-ear])){die(請提供 Black-C…

人工智能:從基礎到前沿

目錄 目錄 1. 引言 2. 人工智能基礎 2.1 什么是人工智能&#xff1f; 2.2 人工智能的歷史 2.3 人工智能的分類 3. 機器學習 3.1 機器學習概述 3.2 監督學習 3.3 無監督學習 3.4 強化學習 4. 深度學習 4.1 深度學習概述 4.2 神經網絡基礎 4.3 卷積神經網絡&#…

漏洞情報:為什么、要什么和怎么做

漏洞一直是網絡攻防的焦點所在&#xff0c;因為漏洞直接或間接影響安全性的核心方面——權限。攻擊者挖掘和利用漏洞&#xff0c;獲取非授權的權限&#xff1b;防御方定位和消除漏洞&#xff0c;監測和阻斷漏洞的利用&#xff0c;使攻擊者無法利用漏洞達到其目的。漏洞信息本質…

leetcode——刪除鏈表的倒數第N個節點(java)

給你一個鏈表&#xff0c;刪除鏈表的倒數第 n 個結點&#xff0c;并且返回鏈表的頭結點。 示例 1&#xff1a; 輸入&#xff1a;head [1,2,3,4,5], n 2 輸出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 輸入&#xff1a;head [1], n 1 輸出&#xff1a;[] 示例 3&#xf…

正則表達式以及Qt中的使用

目錄 一、正則表達式 1、基本匹配&#xff1a; 2、元字符&#xff1a; 2.1 .運算符&#xff1a; 2.2 字符集&#xff1a; 2.3 重復次數&#xff1a; 2.4 量詞{} 2.5 特征標群() 2.6 或運算符 2.7 \反斜線轉碼特殊字符 2.8 錨點 3、簡寫字符 4、零寬度斷言 4.1 正…

【第一天】零基礎入門刷題Python-算法篇-數據結構與算法的介紹(持續更新)

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、Python數據結構與算法的詳細介紹1.基本概念2.Python中的數據結構1. 列表&#xff08;List&#xff09;2. 元組&#xff08;Tuple&#xff09;3. 字典&#…

流行的開源高性能數據同步工具 - Apache SeaTunnel 整體架構運行原理

概述 背景 數據集成在現代企業的數據治理和決策支持中扮演著至關重要的角色。隨著數據源的多樣化和數據量的迅速增長&#xff0c;企業需要具備強大的數據集成能力來高效地處理和分析數據。SeaTunnel通過其高度可擴展和靈活的架構&#xff0c;幫助企業快速實現多源數據的采集、…

消息隊列篇--原理篇--Pulsar(Namespace,BookKeeper,類似Kafka甚至更好的消息隊列)

Apache Pulusar是一個分布式、多租戶、高性能的發布/訂閱&#xff08;Pub/Sub&#xff09;消息系統&#xff0c;最初由Yahoo開發并開源。它結合了Kafka和傳統消息隊列的優點&#xff0c;提供高吞吐量、低延遲、強一致性和可擴展的消息傳遞能力&#xff0c;適用于大規模分布式系…

VS Code i18n國際化組件代碼code顯示中文配置 i18n ally

VUE項目做i18n國際化之后&#xff0c;代碼中的中文都變成了code這時的代碼就會顯得非常難讀&#xff0c;如果有一個插件能把code轉換成中文顯示就好了 vscode插件搜索“i18n ally” 在項目根文件夾下創建文件&#xff1a;.vscode/settings.json settings.json 內容如下 {"…

圖論匯總1

1.圖論理論基礎 圖的基本概念 二維坐標中&#xff0c;兩點可以連成線&#xff0c;多個點連成的線就構成了圖。 當然圖也可以就一個節點&#xff0c;甚至沒有節點&#xff08;空圖&#xff09; 圖的種類 整體上一般分為 有向圖 和 無向圖。 有向圖是指 圖中邊是有方向的&a…

為什么機器學習中梯度下降是減去斜率,而不是按照其數學意義減去斜率的倒數

做個簡單假設&#xff0c;Loss函數的某一個參數的函數曲線是二次方程&#xff0c;其導數函數為 r 2 ? w r 2*w r2?w 按照斜率意義來看&#xff0c;要減去斜率倒數 降低LOSS需要將w1更新為w2&#xff0c;所以更新公式為 w w ? Δ L Δ w w w - \frac{\Delta L}{\Delta w…

iptables和ipvs差異

iptables和ipvs都是Linux內核中用于網絡流量管理的工具&#xff0c;它們在實現方式、功能、性能以及使用場景上存在一些顯著的差異。以下是對兩者的詳細比較&#xff1a; 一、實現方式 iptables&#xff1a; 基于Netfilter框架。使用鏈表&#xff08;chain&#xff09;和規則&…

Effective C++ 規則51:編寫 new 和 delete 時需固守常規

1、背景 在 C 中&#xff0c;如果你需要為類自定義 new 和 delete&#xff0c;必須遵循一些約定和規則&#xff0c;以確保內存管理的一致性、可維護性和安全性。當我們使用 new 和 delete 操作時&#xff0c;C 編譯器會&#xff1a; 調用全局或類特定的 operator new 來分配內…