MySQL的MVCC機制詳解

1. 什么是MVCC?

MVCC(Multi-Version Concurrency Control,多版本并發控制)是數據庫系統中用于實現并發控制的一種技術。它通過保存數據在某個時間點的快照來實現,使得在同一個數據行上可以同時存在多個版本,從而允許讀操作不會阻塞寫操作,寫操作也不會阻塞讀操作,提高了數據庫的并發性能。

2. MVCC在MySQL中的應用

在MySQL中,MVCC主要應用于InnoDB存儲引擎,用于實現事務的隔離級別,特別是“可重復讀(REPEATABLE READ)”和“讀已提交(READ COMMITTED)”隔離級別。MVCC通過為每行記錄添加額外的版本信息來實現,使得不同事務可以訪問到不同版本的數據。

3. MVCC的實現原理

3.1 版本鏈

在InnoDB中,每行記錄除了存儲實際數據外,還包含幾個隱藏字段:

  • DB_TRX_ID:最近一次修改該行記錄的事務ID。
  • DB_ROLL_PTR:回滾指針,指向該行記錄的上一個版本,用于構建版本鏈。
  • DB_ROW_ID:行ID,如果表沒有定義主鍵,InnoDB會自動生成一個行ID作為聚簇索引。
3.2 Undo日志

Undo日志用于記錄數據被修改前的值,以便在事務回滾時恢復數據。同時,Undo日志也用于實現MVCC,通過回滾指針(DB_ROLL_PTR)將不同版本的數據行連接起來,形成一個版本鏈。

3.3 Read View

Read View是事務在某一時刻對數據庫的一個快照,用于判斷當前事務能夠看到哪些版本的數據。Read View主要包含以下幾個關鍵信息:

  • m_ids:當前活躍事務ID的列表,即那些尚未提交的事務ID。
  • min_trx_idm_ids中的最小事務ID。
  • max_trx_id:系統應該分配給下一個事務的ID值。
  • creator_trx_id:創建該Read View的事務ID。

4. 如何判斷數據版本是否可見

當事務執行一個查詢操作時,會生成一個Read View,然后通過以下規則判斷數據行的某個版本是否可見:

  1. 如果數據行版本的事務ID(DB_TRX_ID)小于min_trx_id,表示該版本是已提交事務的修改,因此該版本對當前事務可見。
  2. 如果數據行版本的事務ID(DB_TRX_ID)大于等于max_trx_id,表示該版本是當前事務開始之后才開啟的事務的修改,因此該版本對當前事務不可見。
  3. 如果數據行版本的事務ID(DB_TRX_ID)在min_trx_idmax_trx_id之間,需要進一步判斷:
    • 如果DB_TRX_IDm_ids列表中,表示該版本是由當前活躍事務修改的,因此該版本對當前事務不可見。
    • 如果DB_TRX_ID不在m_ids列表中,表示該版本是已提交事務的修改,因此該版本對當前事務可見。
  4. 如果數據行版本的事務ID(DB_TRX_ID)等于creator_trx_id,表示該版本是當前事務自己修改的,因此該版本對當前事務可見。

如果當前版本不可見,則通過回滾指針(DB_ROLL_PTR)找到上一個版本,并重復上述判斷過程,直到找到一個可見的版本或到達版本鏈的末尾。

5. 不同隔離級別下MVCC的行為

5.1 讀已提交(READ COMMITTED)

在“讀已提交”隔離級別下,每次執行查詢操作時都會生成一個新的Read View。因此,一個事務可以看到其他事務已提交的修改。

5.2 可重復讀(REPEATABLE READ)

在“可重復讀”隔離級別下,一個事務在第一次執行查詢操作時生成一個Read View,并在整個事務期間都使用這個Read View。因此,一個事務在事務期間看到的數據是一致的,不會看到其他事務已提交的修改。

6. 示例

假設有以下事務操作:

  1. 事務1(事務ID為100)將某行記錄的值從A修改為B。
  2. 事務2(事務ID為101)將同一行記錄的值從B修改為C。

此時,該行記錄的版本鏈可能如下:

  • 版本1:值A,事務ID為99,回滾指針指向NULL。
  • 版本2:值B,事務ID為100,回滾指針指向版本1。
  • 版本3:值C,事務ID為101,回滾指針指向版本2。

如果當前有一個事務3(事務ID為102)執行查詢操作,其Read View的m_ids為[100, 101],min_trx_id為100,max_trx_id為103,creator_trx_id為102。事務3將按照以下步驟判斷:

  1. 首先檢查版本3,其事務ID為101,在m_ids列表中,因此不可見。
  2. 通過回滾指針找到版本2,其事務ID為100,同樣在m_ids列表中,因此也不可見。
  3. 再通過回滾指針找到版本1,其事務ID為99,小于min_trx_id,因此可見,事務3將看到值A。

7. MVCC的優點

  1. 提高并發性能:讀操作不會阻塞寫操作,寫操作也不會阻塞讀操作。
  2. 避免臟讀、不可重復讀和幻讀:通過版本控制,事務可以看到一致的數據視圖。

8. 總結

MVCC是MySQL InnoDB存儲引擎實現高并發事務處理的關鍵技術之一。通過保存數據行的多個版本,并利用Read View來判斷數據版本的可見性,MVCC使得數據庫在保證事務隔離性的同時,提高了并發性能。理解MVCC的實現原理,有助于我們更好地理解MySQL的事務處理機制,并優化數據庫的并發性能。

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

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

相關文章

C語言數字圖像處理---2.31統計濾波器

本文介紹空域濾波器中的一種:統計濾波器 [定義與算法] 統計濾波(Statistic Filter)定義:基于圖像處理中的鄰域統計方法,對鄰域內的像素信息進行統計,如基于均值和方差的信息,用于平滑或去噪圖像,同時保留邊緣信息。 算法步驟如下: 統計濾波器的優點和缺點主要包…

計算機視覺相機模型與標定:如何讓計算機“看懂”三維世界?

計算機視覺相機模型與標定:如何讓計算機“看懂”三維世界? 一、前言二、相機模型基礎?2.1 針孔相機模型?2.1.1 模型原理?2.1.2 代碼示例?2.2 透視變換與相機內參?2.2.1 透視變換矩陣?2.2.2 內參矩陣的作用?2.3 相機外參?2.3.1 世界坐標系與相機坐標系的轉換?2.3.2 外…

DeepSpeed ZeRO++:降低4倍網絡通信,顯著提高大模型及類ChatGPT模型訓練效率

圖1: DeepSpeed ZeRO 簡介 大型 AI 模型正在改變數字世界。基于大型語言模型 (LLM)的 Turing-NLG、ChatGPT 和 GPT-4 等生成語言模型用途廣泛,能夠執行摘要、代碼生成和翻譯等任務。 同樣,DALLE、Microsoft Designer 和 Bing Image Creator 等大型多模…

Seq2Seq - 編碼器(Encoder)和解碼器(Decoder)

本節實現一個簡單的 Seq2Seq(Sequence to Sequence)模型 的編碼器(Encoder)和解碼器(Decoder)部分。 重點把握Seq2Seq 模型的整體工作流程 理解編碼器(Encoder)和解碼器&#xff08…

Spring Boot集成MinIO的詳細步驟

1. 安裝MinIO 使用Docker部署MinIO 拉取MinIO鏡像: docker pull minio/minio 這將從Docker Hub中獲取最新的MinIO鏡像。 創建目錄: mkdir -p /home/minio/config mkdir -p /home/minio/data 這些目錄將用于持久化MinIO的數據和配置文件 創建MinIO…

基于PLC的停車場車位控制系統的設計

2.1 設計目標 本課題為基于PLC的停車場車位控制系統來設計,在此將功能確定如下: 針對8個車位的停車場進行設計將停車場分為入口處,車位處、以及出口處三個部分;每個車位都有指示燈指示當前位置是否空閑,方便司機查找空…

微服務即時通信系統---(四)框架學習

目錄 ElasticSearch 介紹 安裝 安裝kibana ES客戶端安裝 頭文件包含和編譯時鏈接庫 ES核心概念 索引(Index) 類型(Type) 字段(Field) 映射(mapping) 文檔(document) ES對比MySQL Kibana訪問ES測試 創建索引庫 新增數據 查看并搜索數據 刪除索引 ES…

除了 `task_type=“SEQ_CLS“`(序列分類),還有CAUSAL_LM,QUESTION_ANS

task_type="SEQ_CLS"是什么意思:QUESTION_ANS 我是qwen,不同模型是不一樣的 SEQ_CLS, SEQ_2_SEQ_LM, CAUSAL_LM, TOKEN_CLS, QUESTION_ANS, FEATURE_EXTRACTION. task_type="SEQ_CLS" 通常用于自然語言處理(NLP)任務中,SEQ_CLS 是 Sequence Classif…

Android ViewPager使用預加載機制導致出現頁面穿透問題

? 緣由 在應用中使用ViewPager,并且設置預加載頁面。結果出現了一些異常的現象。 我們有4個頁面,分別是4個Fragment,暫且稱為FragmentA、FragmentB、FragmentC、FragmentD,ViewPager在MainActivity中,切換時&#x…

apt3.0和apt2.0的區別

一,簡單區別 更新方式 apt2.0:一次性更新所有內容,沒有分階段更新功能。apt3.0:引入分階段更新功能,可分批推送更新包。 界面顯示 apt2.0:界面簡單,輸出信息較為雜亂,沒有彩色高亮和…

過電壓保護器與傳統的保護方式對比

過電壓保護器主要用于保護電氣設備免受大氣過電壓(如雷擊)和操作過電壓(開關動作等引發)的侵害。它通常由非線性電阻片等元件組成,利用其獨特的伏安特性工作。正常電壓下,保護器呈現高阻態,幾乎…

機器學習(3)——決策樹

文章目錄 1. 決策樹基本原理1.1. 什么是決策樹?1.2. 決策樹的基本構成:1.3. 核心思想 2. 決策樹的構建過程2.1. 特征選擇2.1.1. 信息增益(ID3)2.1.2. 基尼不純度(CART)2.1.3. 均方誤差(MSE&…

充電樁領域垂直行業大模型分布式推理與訓練平臺建設方案 - 慧知開源充電樁平臺

沒有任何廣告! 充電樁領域垂直行業大模型分布式推理與訓練平臺建設方案 一、平臺定位與核心價值 行業首個垂直化AI平臺 專為充電樁運營場景設計的分布式大模型訓練與推理基礎設施,實現"算力-算法-場景"三位一體閉環管理。 核心價值主張&am…

NLP高頻面試題(四十五)——PPO 算法在 RLHF 中的原理與實現詳解

近端策略優化(Proximal Policy Optimization, PPO)算法是強化學習領域的一種新穎且高效的策略優化方法,在近年大規模語言模型的人類反饋強化學習(Reinforcement Learning with Human Feedback, RLHF)中發揮了關鍵作用。本文將以學術嚴謹的風格,詳細闡述 PPO 算法的原理及…

C++指針和引用之區別(The Difference between C++Pointers and References)

面試題:C指針和引用有什么區 C指針和引用有什么區別? 在 C 中,指針和引用都是用來訪問其他變量的值的方式,但它們之間存在一些重要的區別。了解這些區別有助于更好地理解和使用這兩種工具。 01 指針 指針(Pointer…

LWIP學習筆記

TCP/ip協議結構分層 傳輸層簡記 TCP:可靠性強,有重傳機制 UDP:單傳機制,不可靠 UDP在ip層分片 TCP在傳輸層分包 應用層傳輸層網絡層,構成LWIP內核程序: 鏈路層;由mac內核STM芯片的片上外設…

【經驗記錄貼】活用shell,提高工作效率

背景 最近在做測試的時候,需要手動kill服務的進程,然后通過命令重啟服務,再進行測試。每次重啟都會涉及到下面三個命令的執行: 1)檢索進程ID $ ps -eLf | grep programname root 1123 112 1234 0 0 0 0:00…

MacOS 系統下 Git 的詳細安裝步驟與基礎設置指南

MacOS 系統下 Git 的詳細安裝步驟與基礎設置指南—目錄 一、安裝 Git方法 1:通過 Homebrew 安裝(推薦)方法 2:通過 Xcode Command Line Tools 安裝方法 3:手動下載安裝包 二、基礎配置1. 設置全局用戶名和郵箱2. 配置 …

一文讀懂 AI

2022年11月30日,OpenAI發布了ChatGPT,2023年3月15日,GPT-4引發全球轟動,讓世界上很多人認識了ai這個詞。如今已過去快兩年半,AI產品層出不窮,如GPT-4、DeepSeek、Cursor、自動駕駛等,但很多人仍…

【教程】檢查RDMA網卡狀態和測試帶寬 | 附測試腳本

轉載請注明出處:小鋒學長生活大爆炸[xfxuezhagn.cn] 如果本文幫助到了你,歡迎[點贊、收藏、關注]哦~ 目錄 檢查硬件和驅動狀態 測試RDMA通信 報錯修復 對于交換機的配置,可以看這篇: 【教程】詳解配置多臺主機通過交換機實現互…