InnoDB的MVCC實現原理?MVCC如何實現不同事務隔離級別?MVCC優缺點?

概念

InnoDB的MVCC(Multi-Version Concurrency Control)即多版本并發控制,是一種用于處理并發事務的機制。它通過保存數據在不同時間點的多個版本,讓不同事務在同一時刻可以看到不同版本的數據,以此來減少鎖競爭,提高數據庫的并發性能,同時保證事務的隔離性。

實現原理

隱藏列

InnoDB會為表中的每行記錄添加三個隱藏列:

  • DB_TRX_ID:記錄最后一次對該行記錄進行插入或更新操作的事務ID。當進行刪除操作時,也會將其視為一次更新操作,只是會將該行記錄標記為已刪除。
  • DB_ROLL_PTR:回滾指針,指向該行記錄的上一個版本所在的回滾段。通過這個指針,能找到該行記錄的歷史版本。
  • DB_ROW_ID:如果表沒有主鍵,InnoDB會自動生成一個隱藏的自增主鍵。
回滾段(Rollback Segment)

回滾段用于存儲數據的舊版本。當一個事務對某行記錄進行更新或刪除操作時,InnoDB不會直接覆蓋原數據,而是將舊版本的數據復制到回滾段中,并更新當前行的DB_TRX_IDDB_ROLL_PTR。這樣,就可以保留數據的歷史版本,供其他事務查看。

事務ID

每個事務在啟動時都會被分配一個唯一的事務ID,且這個ID是按照事務啟動的順序依次遞增的。

可見性判斷規則

在不同的事務隔離級別下,InnoDB根據事務的開始時間和記錄的隱藏列信息來判斷哪些版本的數據對當前事務是可見的。以下以可重復讀(REPEATABLE READ)隔離級別為例說明:

  • 當事務開始時,會獲取一個當前系統中所有活躍事務ID的列表。
  • 對于要查詢的每一行記錄:
    • 如果該行記錄的DB_TRX_ID小于當前事務開始時活躍事務ID列表中的最小值,說明該行記錄是在當前事務開始之前就已經提交的事務修改的,當前事務可以看到這個版本的數據。
    • 如果該行記錄的DB_TRX_ID大于當前事務開始時活躍事務ID列表中的最大值,說明該行記錄是在當前事務開始之后才開始的事務修改的,當前事務看不到這個版本的數據。
    • 如果該行記錄的DB_TRX_ID在當前事務開始時活躍事務ID列表的范圍內,需要進一步判斷該事務是否已經提交。如果已經提交,當前事務可以看到這個版本的數據;如果未提交,當前事務看不到這個版本的數據。

不同事務隔離級別下的MVCC表現

讀未提交(READ UNCOMMITTED)

此隔離級別下,MVCC基本不起作用。事務可以讀取到其他事務未提交的數據,不會考慮數據版本的可見性規則,可能會出現臟讀問題。

讀已提交(READ COMMITTED)
  • 每次查詢時都會生成一個新的快照,即獲取當前最新的活躍事務ID列表。
  • 事務只能看到已經提交的事務所做的更改,避免了臟讀問題,但可能會出現不可重復讀問題,因為在同一個事務中不同時間點的查詢可能會看到不同版本的數據。
可重復讀(REPEATABLE READ)
  • 事務在開始時會生成一個快照,在整個事務期間都會使用這個快照。
  • 同一個事務中多次讀取相同的數據,看到的版本始終是一致的,避免了不可重復讀問題,但可能會出現幻讀問題(不過InnoDB通過間隙鎖等機制在一定程度上解決了幻讀問題)。
串行化(SERIALIZABLE)

該隔離級別下,MVCC不發揮作用。事務會對讀取的數據加共享鎖,對寫入的數據加排他鎖,事務之間是串行執行的,避免了所有并發問題,但會導致并發性能極低。

MVCC的優點

  • 提高并發性能:多個事務可以同時對數據進行讀寫操作,減少了鎖競爭,從而提高了數據庫的并發處理能力。
  • 實現事務隔離:不同的事務可以看到不同版本的數據,從而實現了不同級別的事務隔離,保證了數據的一致性和完整性。
  • 避免死鎖:由于減少了鎖的使用,降低了事務之間相互等待鎖的情況,減少了死鎖的發生概率。

MVCC的局限性

  • 占用額外存儲空間:為了保存數據的多個版本,需要使用回滾段來存儲舊版本的數據,這會占用額外的存儲空間。
  • 增加系統復雜度:MVCC的實現需要維護隱藏列、回滾段和事務ID等信息,增加了系統的復雜度和管理難度。
  • 可能導致長事務問題:如果一個事務長時間不提交,會保留大量的舊版本數據,可能會導致回滾段空間不足,影響系統性能。

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

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

相關文章

針對 Java從入門到精通 的完整學習路線圖、各階段技術點、CTO進階路徑以及經典書籍推薦。內容分階段展開,兼顧技術深度與職業發展

以下是針對 Java從入門到精通 的完整學習路線圖、各階段技術點、CTO進階路徑以及經典書籍推薦。內容分階段展開,兼顧技術深度與職業發展。 一、學習路線圖分階段詳解 階段1:Java基礎入門(3-6個月) 目標:掌握Java核心…

報錯:Nlopt

報錯:Nlopt CMake Error at TGH-Planner/fast_planner/bspline_opt/CMakeLists.txt:20 (find_package):By not providing "FindNLopt.cmake" in CMAKE_MODULE_PATH this project hasasked CMake to find a package configuration file provided by "…

鴻蒙公共通用組件封裝實戰指南:從基礎到進階

一、鴻蒙組件封裝核心原則 1.1 高內聚低耦合設計 在鴻蒙應用開發中,高內聚低耦合是組件封裝的關鍵準則,它能極大提升代碼的可維護性與復用性。 從原子化拆分的角度來看,我們要把復雜的 UI 界面拆分為基礎組件和復合組件。像按鈕、輸入框這…

Linux 網絡基礎二 ——應用層HTTP\HTTPS協議

我們程序員寫的一個個解決我們實際問題,滿足我們日常需求的網絡程序,都是在應用層。 前面寫的套接字接口都是傳輸層經過對 UDP 和 TCP 數據發送能力的包裝,以文件的形式呈現給我們,讓我們可以進行應用層編程。換而言之&#xff0c…

Spark-SQL

Spark-SQL 概述 Spark SQL 是 Spark 用于結構化數據(structured data)處理的 Spark 模塊 Shark 是伯克利實驗室 Spark 生態環境的組件之一,是基于 Hive 所開發的工具,它修改了內存管理、物理計劃、執行三個模塊,并使之能運行在 Spark 引擎上…

Java 在人工智能領域的突圍:從企業級架構到邊緣計算的技術革新

一、Java AI 的底層邏輯:從語言特性到生態重構 在 Python 占據 AI 開發主導地位的當下,Java 正通過技術重構實現突圍。作為擁有 30 年企業級開發經驗的編程語言,Java 的核心優勢在于強類型安全、內存管理能力和分布式系統支持,這…

編程實現除法程序時需要注意的細節

使用Python實現除法程序時,需注意以下關鍵細節: 除數為零的處理 必須檢查除數是否為零,否則會觸發ZeroDivisionError異常。可通過try-except結構捕獲異常并處理。 整數除法與浮點數除法的區別 ? 使用/運算符時,無論操作數是否為…

Java萬級并發場景-實戰解決

今天我們來做一個典型的消費力度能達到萬級別的并發場景,老師點名-學生簽到 正常情況 正常情況來說是不同班級下的老師發布不同的點名--然后不同班級下的很多學生同一時間進行簽到,簽到成功就去修改數據庫,簽到失敗就返回,但是這…

openGauss新特性 | 自動參數化執行計劃緩存

目錄 自動化參數執行計劃緩存簡介 SQL參數化及約束條件 一般常量參數化示例 總結 自動化參數執行計劃緩存簡介 執行計劃緩存用于減少執行計劃的生成次數。openGauss數據庫會緩存之前生成的執行計劃,以便在下次執行該SQL時直接使用,可…

計算機操作系統——存儲器管理

系列文章目錄 1.存儲器的層次結構 2.程序的裝入和鏈接 3.連續分配存儲管理方式(內存夠用) 4.對換(Swapping)(內存不夠用) 5.分頁存儲管理方式 6.分段存儲管理方式 文章目錄 系列文章目錄前言一、存儲器的存儲結構寄存器&…

KF V.S. GM-PHD

在計算機視覺的多目標跟蹤(MOT)任務中,卡爾曼濾波(KF)和高斯混合概率假設密度(GM-PHD)濾波器是兩種經典的狀態估計方法,但它們的原理和應用場景存在顯著差異。以下是兩者的核心機制和…

車載通信架構 --- DOIP系統機制初入門

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 周末洗了一個澡,換了一身衣服,出了門卻不知道去哪兒,不知道去找誰,漫無目的走著,大概這就是成年人最深的孤獨吧! 舊人不知我近況,新人不知我過…

C++對象池設計:從高頻`new/delete`到性能飛躍的工業級解決方案

一、new/delete的性能之殤:一個真實的生產事故 2023年某證券交易系統在峰值時段出現請求堆積,事后定位發現:每秒40萬次的訂單對象創建/銷毀,導致: 內存碎片率高達37%(jemalloc統計)malloc調用…

【C/C++】深入理解整型截斷與提升:原理、應用與區別

文章目錄 1. 整形截斷(Integer Truncation)1.1 整形截斷的例子1.2 整形截斷的細節 2. 整形提升(Integer Promotion)2.1 整形提升的規則2.2 整形提升的示例2.3 整形提升的實際應用2.4 整型提升與標準操作符 3. 整型截斷與提升的區別…

python藍橋杯備賽常用算法模板

一、python基礎 (一)集合操作 s1 {1,2,3} s2{3,4,5} print(s1|s2)#求并集 print(s1&s2)#求交集 #結果 #{1, 2, 3, 4, 5} #{3}(二)對多維列表排序 1.新建列表 list1[[1,2,3],[2,3,4],[0,3,2]] #提取每個小列表的下標為2的…

【模塊化拆解與多視角信息3】教育背景:學歷通脹時代的生存法則

教育背景:學歷通脹時代的生存法則 寫在最前 作為一個中古程序猿,我有很多自己想做的事情,比如埋頭苦干手搓一個低代碼數據庫設計平臺(目前只針對寫java的朋友),比如很喜歡幫身邊的朋友看看簡歷,講講面試技巧,畢竟工作這么多年,也做到過高管,有很多面人經歷,意見還算…

uniapp實現H5頁面麥克風權限獲取與錄音功能

1.權限配置 在uni-app開發H5頁面時,需要在manifest.json文件中添加錄音權限的配置。具體如下: {"h5": {"permissions": {"scope.record": {"desc": "請授權使用錄音功能"}}} }這段配置代碼是用于向…

功能豐富的PDF處理免費軟件推薦

軟件介紹 今天給大家介紹一款超棒的PDF工具箱,它處理PDF文檔的能力超強,而且是完全免費使用的,沒有任何限制。 TinyTools(PC)這款軟件,下載完成后即可直接打開使用。在使用過程中,操作完畢后&a…

鴻蒙開發-ArkUi控件使用

2.0控件-按鈕 2.1.控件-文本框 Text(this.message).fontSize(40) // 設置文本的文字大小.fontWeight(FontWeight.Bolder) // 設置文本的粗細.fontColor(Color.Red) // 設置文本的顏色------------------------------------------------------------------------- //設置邊框Tex…

深入理解 ResponseBodyAdvice 及其應用

ResponseBodyAdvice 是 Spring MVC 提供的一個強大接口&#xff0c;允許你在響應體被寫入 HTTP 響應之前對其進行全局處理。 下面我將全面介紹它的工作原理、使用場景和最佳實踐。 基本概念 接口定義 public interface ResponseBodyAdvice<T> {boolean supports(Metho…