innodb如何實現mvcc的

InnoDB 實現 MVCC(多版本并發控制)的機制主要依賴于 Undo Log(回滾日志)Read View(讀視圖)隱藏的事務字段。以下是具體實現步驟和原理:


1. 核心數據結構

InnoDB 的每一行數據(聚簇索引記錄)包含兩個隱藏字段:

  • DB_TRX_ID:最近修改該行的事務 ID。
  • DB_ROLL_PTR:指向該行舊版本數據的回滾指針(即 Undo Log 的地址)。

2. Undo Log 與版本鏈

  • Undo Log 的作用
    每次對數據進行修改(INSERT/UPDATE/DELETE),InnoDB 會生成 Undo Log,記錄修改前的數據鏡像。
  • 版本鏈的構建
    通過 DB_ROLL_PTR 字段,將同一行數據的多個版本按修改順序鏈接成鏈表。
    示例
    當前行 → [版本3: trx_id=300, roll_ptr → 版本2]  ↑  
    版本2 → [trx_id=200, roll_ptr → 版本1]  ↑  
    版本1 → [trx_id=100, roll_ptr → NULL]
    

3. Read View 的生成

當事務執行 一致性讀(如 SELECT)時,InnoDB 為其生成一個 Read View,包含以下信息:

  • m_ids:當前活躍(未提交)的事務 ID 列表。
  • min_trx_idm_ids 中的最小事務 ID。
  • max_trx_id:下一個即將分配的事務 ID(即當前最大事務 ID +1)。
  • creator_trx_id:創建該 Read View 的事務 ID(僅當該事務自身有修改時存在)。

4. 數據可見性判斷規則

對于某一數據行的版本,判斷其對當前事務是否可見的規則如下:

  1. 版本的事務 ID < min_trx_id
    該版本已提交,可見。
  2. 版本的事務 ID ≥ max_trx_id
    該版本由未來事務生成,不可見。
  3. min_trx_id ≤ 版本的事務 ID < max_trx_id
    • 若版本的事務 ID 不在 m_ids,說明該事務已提交,可見。
    • 若版本的事務 ID m_ids,說明該事務未提交,不可見。
  4. 版本的事務 ID = creator_trx_id
    該版本由當前事務自身修改,可見。

5. MVCC 的查詢流程

  1. 定位最新數據行:通過聚簇索引找到當前行的最新版本。
  2. 遍歷版本鏈:從最新版本開始,根據 DB_ROLL_PTR 回溯舊版本。
  3. 可見性檢查:對每個版本應用 Read View 規則,找到第一個可見的版本。

示例
假設事務 A(trx_id=200)的 Read View 中:

  • m_ids = [100, 300]
  • min_trx_id=100, max_trx_id=400

遍歷某行的版本鏈:

  • 版本3(trx_id=300):在 m_ids 中 → 不可見。
  • 版本2(trx_id=200):等于 creator_trx_id → 可見(若事務 A 修改了該行)。
  • 版本1(trx_id=100):在 m_ids 中 → 不可見。
  • 版本0(trx_id=50):小于 min_trx_id → 可見。

最終事務 A 讀取到版本0。


6. 不同隔離級別的實現差異

  • 讀已提交(Read Committed)
    每次執行 SELECT 時生成新的 Read View,看到已提交的最新數據。
  • 可重復讀(Repeatable Read)
    事務內第一次 SELECT 時生成 Read View,后續復用該視圖,保證多次讀取一致性。

7. Undo Log 的清理

  • Insert Undo Log:事務提交后立即刪除(不參與 MVCC)。
  • Update/Delete Undo Log:需保留至所有可能訪問舊版本的事務結束(通過 purge 線程異步清理)。

8. MVCC 與鎖的協同

  • 寫操作(UPDATE/DELETE)
    即使使用 MVCC,寫操作仍需加鎖(如行鎖)避免臟寫。
  • 讀操作(SELECT)
    默認無鎖,通過 MVCC 讀取快照版本。若需鎖定讀,可加鎖(如 SELECT ... FOR UPDATE)。

總結

InnoDB 通過以下機制實現 MVCC:

  1. 版本鏈:通過 DB_ROLL_PTR 鏈接數據的歷史版本。
  2. Read View:判斷事務可見性的依據。
  3. Undo Log:存儲歷史版本數據,支持版本鏈回溯。
  4. 隔離級別適配:通過動態生成或復用 Read View 實現不同隔離級別。
# MVCC 執行示例
事務A(trx_id=200)讀取某行數據:
1. 找到最新版本(trx_id=300)。
2. 檢查 Read View:m_ids=[100, 300], min=100, max=400。
3. trx_id=300 在 m_ids 中 → 不可見。
4. 回溯到版本2(trx_id=200),等于 creator_trx_id → 可見。

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

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

相關文章

coding ability 展開第九幕(位運算——進階篇)超詳細!!!!

文章目錄 前言丟失的數字兩整數之和只出現一次的數字II消失的兩個數字總結 前言 上一篇博客&#xff0c;我們已經把位運算的基礎知識&#xff0c;以及基本運算都掌握啦 上次的習題還是讓人意猶未盡&#xff0c;今天我們來嘗試一下難一點的題目 位運算熟練起來真的讓人覺得做題是…

【數據結構篇】算法征途:穿越時間復雜度與空間復雜度的迷霧森林

文章目錄 【數據結構篇】算法征途&#xff1a;穿越時間復雜度與空間復雜度的迷霧森林 一、 什么是算法1. 算法的定義1.1 算法的五個特征1.2 好算法的特質 2. 時間復雜度3. 空間復雜度 【數據結構篇】算法征途&#xff1a;穿越時間復雜度與空間復雜度的迷霧森林 &#x1f4ac;歡…

Logo語言的系統監控

Logo語言的系統監控 引言 在信息技術飛速發展的時代&#xff0c;系統監控成為了確保計算機系統和網絡平穩運行的重要手段。系統監控不僅可以實時跟蹤系統的性能、資源使用情況和安全風險等&#xff0c;還能夠在出現問題時及時發出警報&#xff0c;從而避免潛在的故障和損失。…

STP學習

{所有內容均來自于西安歐鵬的陳俊老師} STP生成樹 當二層交換機意外成環路的時候會發生&#xff1a; 1.廣播風暴&#xff1a;當廣播幀進入環路時&#xff0c;會被不斷復制并傳輸&#xff0c;導致網絡中的廣播流量急劇增加&#xff0c;消耗大量的網絡帶寬&#xff0c;降低網絡…

使用RKNN進行yolo11-cls部署

文章目錄 概要制作數據集模型訓練onnx導出rknn導出概要 YOLO(You Only Look Once)是一系列高效的目標檢測算法,其核心思想是將目標檢測任務轉化為一個回歸問題,通過單個神經網絡直接在圖像上預測邊界框和類別概率。當將其用于分類任務時,會去除目標檢測相關的邊界框預測部…

【MySQL】01.MySQL環境安裝

注意&#xff1a;在MYSQL的安裝與卸載中&#xff0c;需要使用root用戶進行。 一、卸載不必要的環境 ? 查看是否有運行的服務 [rootVM-24-10-centos etc]# ps axj |grep mysql1 22030 22029 22029 ? -1 Sl 27 0:00 /usr/sbin/mysqld --daemonize --pid-fi…

程序化廣告行業(59/89):廣告驗證與反作弊實戰技巧

程序化廣告行業&#xff08;59/89&#xff09;&#xff1a;廣告驗證與反作弊實戰技巧 大家好&#xff01;在程序化廣告領域&#xff0c;想要做好投放&#xff0c;除了了解基本的架構和原理&#xff0c;還得掌握一些關鍵的技能&#xff0c;比如廣告驗證和反作弊。今天就和大家一…

矢量瓦片切片工具

1.geoserver 可以生成geojson mvt(pbf) tojson 三種格式矢量瓦片 2.mapbox的tippecanoe 可以生成pbf矢量瓦片&#xff0c;文件夾形式和mbtiles兩種 3.TileStache python工具&#xff0c;可以生成geojson瓦片 4.PostGis mapbox插件可以生成pbf瓦片&#xff0c;據說是動態切片…

Windows 系統 Git 2.15.0 (64位) 下載與安裝教程

1. 下載 Git 2.15.0 (64位) 安裝包 下載地址&#xff1a;https://pan.quark.cn/s/f817ab9285dc 2. 運行安裝程序 雙擊下載的 Git-2.15.0-64-bit.exe。 如果系統提示安全警告&#xff0c;選擇 “運行”&#xff08;確認來源可信&#xff09;。 3. 安裝向導設置 按以下步驟配…

MCP服務器:AI與外部工具交互的橋梁——Python和代理AI工具集成指南

&#x1f9e0; 向所有學習者致敬&#xff01; “學習不是裝滿一桶水&#xff0c;而是點燃一把火。” —— 葉芝 我的博客主頁&#xff1a; https://lizheng.blog.csdn.net &#x1f310; 歡迎點擊加入AI人工智能社區&#xff01; &#x1f680; 讓我們一起努力&#xff0c;共創…

AIGC8——大模型生態與開源協作:技術競逐與普惠化浪潮

引言&#xff1a;大模型發展的分水嶺時刻 2024年成為AI大模型發展的關鍵轉折點&#xff1a;OpenAI的GPT-4o實現多模態實時交互&#xff0c;中國DeepSeek-MoE-16b模型以1/8成本達到同類90%性能&#xff0c;而開源社區如Mistral、LLama 3持續降低技術門檻。這場"閉源商業巨…

Muduo網絡庫實現 [十五] - HttpContext模塊

目錄 設計思路 類的設計 解碼過程 模塊的實現 私有接口 請求函數 解析函數 公有接口 疑惑點 設計思路 記錄每一次請求處理的進度&#xff0c;便于下一次處理。 上下文模塊是Http協議模塊中最重要的一個模塊&#xff0c;他需要記錄每一次請求處理的進度&#xff0c;需…

解決GraalVM Native Maven Plugin錯誤:JAVA_HOME未指向GraalVM Distribution

目錄 問題描述解決方案為什么需要這樣配置&#xff1f; 問題描述 在你的項目中&#xff0c;如果你遇到了以下錯誤信息&#xff1a; [ERROR] Failed to execute goal org.graalvm.buildtools:native-maven-plugin:0.10.5:test (native-test) on project DIctSystemInJavaUsing…

java 代碼錯誤分析

錯誤代碼 class Test {private static String name; // 聲明一個私有靜態變量 namename "World"; // 靜態初始化塊&#xff0c;給 name 賦值為 "World"System.out.print(name); // 打印 name 的值public static void main(String[] args) {System.out.p…

企業供應鏈管理

企業供應鏈管理 企業供應鏈管理 企業供應鏈管理企業信息化信息化的作用信息化的發展階段信息化建設的挑戰 SRM&#xff08;供應商關系管理&#xff09;SRM架構參考圖企業內部系統協作&#xff1a; ERP (企業資源計劃)OA (辦公自動化)業務功能模塊&#xff1a;企業日常辦公 EMS …

Pascal語言的系統監控

Pascal語言的系統監控 引言 在現代計算機系統中&#xff0c;系統監控是確保計算機平穩運行的重要組成部分。無論是個人計算機還是大型服務器&#xff0c;監控系統的性能、資源使用及狀態&#xff0c;都是提高系統效率、及時發現問題的關鍵。Pascal語言作為一種結構化編程語言…

出現次數超過一半的數(信息學奧賽一本通-1186)

【題目描述】 給出一個含有n&#xff08;0 < n < 1000&#xff09;個整數的數組&#xff0c;請找出其中出現次數超過一半的數。數組中的數大于-50且小于50。 【輸入】 第一行包含一個整數n&#xff0c;表示數組大小&#xff1b; 第二行包含n個整數&#xff0c;分別是數組…

解決 CANoe 多測試用例下固定 IP 地址沖突問題的分析與方案

問題描述&#xff1a; CANoe的測試環境如下&#xff1a; 在Ethernet1總線上&#xff0c;通過VN5620連接了PCU&#xff08;實物&#xff09;&#xff1b; 使用VtestStudio&#xff08;VTS&#xff09;開發&#xff0c;并且生成了三個測試腳本(vtt文件)&#xff0c;分別為&#…

React 項目使用 pdf.js 及 Elasticpdf 教程

摘要&#xff1a;本文章介紹如何在 React 中使用 pdf.js 及基于 pdf.js 的批注開發包 Elasticpdf。簡單 5 步可完成集成部署&#xff0c;包括數據的云端同步&#xff0c;示例代碼完善且簡單&#xff0c;文末有集成代碼分享。 1. 工具庫介紹與 Demo 1.1 代碼包結構 ElasticP…

python爬蟲:小程序逆向(需要的工具前期準備)

前置知識點 1. wxapkg文件 如何查看小程序包文件 打開wechat的設置&#xff1a; .wxapkg概述 .wxapkg是小程序的包文件格式&#xff0c;且其具有獨特的結構和加密方式。它不僅包含了小程序的源代碼&#xff0c;還包括了圖像和其他資源文件&#xff0c;這些內容在普通的文件…