MySQL InnoDB引擎 MVCC

MVCC(Multi-Version Concurrency Control)即多版本并發控制,是 MySQL 的 InnoDB 存儲引擎實現并發控制的一種重要技術。它在很多情況下避免了加鎖操作,從而提高了數據庫的并發性能。

一、原理

MVCC 的核心思想是通過保存數據在某個時間點的快照來實現并發控制。

在 MVCC 模型下,每個事務在啟動時會看到一個數據庫的一致性視圖,該視圖是由事務啟動時數據庫中所有已提交事務的狀態決定的。

事務只能看到在其啟動之前,已經提交的事務所做的更改,而看不到在其啟動之后其他事務的未提交更改或新插入的數據,這樣就避免了臟讀、不可重復讀等問題。

二、實現方式

InnoDB 存儲引擎通過幾個關鍵要素來實現 MVCC,包括隱藏列、回滾段(undo log)、事務 ID 和一致性視圖(Read View)。

1. 隱藏列

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

  • DB_TRX_ID:記錄最近一次對該記錄進行修改(INSERT、UPDATE)的事務 ID。當一個事務對記錄進行插入操作時,會將自己的事務 ID 賦值給該記錄的?DB_TRX_ID?列。

  • DB_ROLL_PTR:回滾指針,指向該記錄的上一個版本所在的回滾段(undo log)。當對記錄進行修改時,會將修改前的記錄版本信息存儲在回滾段中,并通過?DB_ROLL_PTR?指針指向該版本。

  • DB_ROW_ID:如果表中沒有定義主鍵且沒有唯一的非空索引,InnoDB 會自動為表添加一個隱藏的自增主鍵?DB_ROW_ID

2. 回滾段(undo log)

回滾段用于存儲記錄的舊版本信息。當一個事務對記錄進行修改時,會將修改前的記錄版本信息存儲在回滾段中,并通過?DB_ROLL_PTR?指針將當前記錄與舊版本記錄連接起來,形成一個版本鏈。通過版本鏈,我們可以找到記錄在不同時間點的所有版本。

在 MySQL InnoDB 引擎中,回滾段(undo log)的合理配置對于數據庫的性能、事務處理以及數據恢復等方面都至關重要。

關鍵配置參數

1.?innodb_undo_logs

  • 作用:該參數用于設置 InnoDB 存儲引擎中回滾段的數量。在 MySQL 5.6 及以后的版本中,默認值通常為 128 個。增加回滾段的數量可以提高并發事務處理能力,因為多個事務可以同時使用不同的回滾段,減少了回滾段的競爭。

  • 配置示例:若要將回滾段數量設置為 256,可以在 MySQL 配置文件(通常是?my.cnf?或?my.ini)中添加或修改如下配置:

[mysqld]
innodb_undo_logs = 256

2.?innodb_undo_tablespaces

  • 作用:此參數用于指定回滾段所在的表空間數量。從 MySQL 5.6 開始,InnoDB 支持將回滾段存儲在獨立的表空間中,這樣可以更好地管理回滾段的空間。設置多個回滾段表空間可以分散 I/O 負載,提高性能。

  • 配置示例:假設要將回滾段存儲在 3 個獨立的表空間中,可在配置文件中添加:

[mysqld]
innodb_undo_tablespaces = 3

3.?innodb_max_undo_log_size

  • 作用:該參數限制了單個回滾段文件的最大大小。當回滾段文件達到這個大小后,InnoDB 會嘗試回收不再使用的 undo log 空間。如果無法回收足夠的空間,可能會導致事務等待或報錯。

  • 配置示例:若要將單個回滾段文件的最大大小設置為 2GB,可以在配置文件中添加:

[mysqld]
innodb_max_undo_log_size = 2G

4.?innodb_undo_log_truncate

  • 作用:這是一個布爾型參數,用于控制是否啟用回滾段文件的截斷功能。當設置為?ON?時,InnoDB 會在合適的時機自動截斷回滾段文件,釋放不再使用的空間。默認值為?OFF

  • 配置示例:若要啟用回滾段文件截斷功能,可在配置文件中添加:

[mysqld]
innodb_undo_log_truncate = ON

配置建議

  • 根據并發情況調整回滾段數量:如果數據庫中有大量的并發事務,適當增加?innodb_undo_logs?的值可以減少回滾段的競爭,提高并發性能。但過多的回滾段也會增加系統管理的開銷,需要根據實際情況進行權衡。

  • 使用獨立的回滾段表空間:將回滾段存儲在獨立的表空間中(通過設置?innodb_undo_tablespaces)可以提高 I/O 性能,尤其是在高并發場景下。

  • 合理設置回滾段文件大小innodb_max_undo_log_size?的設置需要考慮數據庫的事務大小和頻率。如果事務較大或頻繁,可適當增大該值;反之,則可以減小。

  • 啟用回滾段文件截斷功能:對于長期運行的數據庫,啟用?innodb_undo_log_truncate?可以有效地管理回滾段的空間,避免回滾段文件無限增長。

3. 事務 ID

每個事務在啟動時會被分配一個唯一的事務 ID,事務 ID 是一個單調遞增的整數。通過比較事務 ID 的大小,我們可以判斷事務的先后順序。

4. 一致性視圖(Read View)

一致性視圖是 MVCC 的關鍵機制之一,它是一個事務在啟動時生成的,用于判斷當前事務可以看到哪些版本的記錄。一致性視圖中包含了以下幾個重要信息:

  • 低水位(trx_ids_min):當前所有活躍事務中最小的事務 ID。

  • 高水位(trx_ids_max):生成該視圖時系統分配的下一個事務 ID。

  • 活躍事務列表(trx_ids):生成該視圖時所有活躍事務的事務 ID 列表。

5. 工作流程

MVCC 的工作流程主要涉及讀操作和寫操作:

讀操作

當一個事務要讀取某條記錄時,會根據記錄的?DB_TRX_ID?和一致性視圖的信息來判斷是否可以看到該記錄的當前版本。具體規則如下:

  • 如果?DB_TRX_ID < trx_ids_min,即最近修改數據的事務 ID?小于 當前所有活躍事務的最小事務 ID,表示該記錄的修改事務在當前事務啟動之前已經提交,當前事務可以看到該記錄的當前版本。

  • 如果?DB_TRX_ID >= trx_ids_max,即最近修改數據的事務 ID 大于等于 生成該視圖時系統分配的下一個事務 ID,表示該記錄的修改事務在當前事務啟動之后才啟動,當前事務看不到該記錄的當前版本,需要通過?DB_ROLL_PTR?指針查找舊版本。

  • 如果?trx_ids_min <= DB_TRX_ID < trx_ids_max,需要判斷?DB_TRX_ID?是否在活躍事務列表?trx_ids?中:

    • 如果在列表中,表示該記錄的修改事務在當前事務啟動時還未提交,當前事務看不到該記錄的當前版本,需要通過?DB_ROLL_PTR?指針查找舊版本。

    • 如果不在列表中,表示該記錄的修改事務在當前事務啟動時已經提交,當前事務可以看到該記錄的當前版本。

寫操作

當一個事務要對某條記錄進行修改時,會將修改前的記錄版本信息存儲在回滾段中,并更新記錄的?DB_TRX_ID?和?DB_ROLL_PTR?列。具體步驟如下:

  1. 將修改前的記錄版本信息復制到回滾段中。

  2. 更新記錄的?DB_TRX_ID?列,將其設置為當前事務的事務 ID。

  3. 更新記錄的?DB_ROLL_PTR?指針,使其指向回滾段中存儲的舊版本記錄。

  4. 對記錄進行實際的修改操作。

通過這種方式,寫操作會創建一個新的數據版本,而不會影響其他事務對舊版本的讀取。不同事務可以在不同的版本上進行操作,從而實現了讀寫操作的并發執行。

綜上所述,MVCC 通過隱藏列、回滾段、事務 ID 和一致性視圖等機制,實現了讀寫操作的并發執行,提高了數據庫的并發性能,同時保證了數據的一致性。不同的事務隔離級別會影響一致性視圖的生成和使用方式,從而實現不同程度的數據隔離。

三、對比

MVCC(多版本并發控制)和傳統的鎖機制都是數據庫中用于實現并發控制的重要技術,它們各自具有獨特的優缺點,以下是詳細對比:

優點對比

MVCC
  • 高并發性能

    • MVCC 允許多個事務在不同版本的數據上進行讀寫操作,避免了大部分情況下的讀寫鎖沖突。讀操作可以直接讀取數據的歷史版本,無需等待寫操作釋放鎖,寫操作也不會阻塞讀操作,從而顯著提高了數據庫的并發處理能力。例如,在一個高并發的電商系統中,大量用戶同時進行商品信息的查詢(讀操作)和訂單的創建(寫操作),MVCC 可以讓這些操作并行執行,減少用戶的等待時間。

  • 實現事務隔離

    • 能夠方便地實現不同的事務隔離級別,如讀已提交(Read Committed)和可重復讀(Repeatable Read)。通過一致性視圖(Read View),事務可以看到特定時間點的數據快照,保證了數據的一致性和隔離性。在可重復讀隔離級別下,一個事務在整個生命周期內多次讀取同一數據時,會看到相同的結果,避免了不可重復讀和部分幻讀問題。

  • 減少死鎖概率

    • 由于讀操作通常不需要加鎖,減少了鎖的使用,從而降低了死鎖發生的可能性。死鎖是傳統鎖機制中常見的問題,當多個事務相互等待對方釋放鎖時,就會導致死鎖的發生。MVCC 的使用使得事務之間的鎖競爭減少,系統的穩定性得到提高。

傳統鎖機制
  • 強一致性保證

    • 傳統鎖機制可以提供嚴格的一致性保證,確保在同一時間只有一個事務可以訪問或修改數據。在串行化隔離級別下,通過對數據加鎖,保證了事務的串行執行,避免了任何并發問題,如臟讀、不可重復讀和幻讀,適用于對數據一致性要求極高的場景,如金融交易系統。

  • 精確控制并發

    • 可以精確地控制事務對數據的訪問權限,根據不同的業務需求選擇不同類型的鎖(如共享鎖、排他鎖)和加鎖粒度(如行鎖、表鎖)。例如,在某些情況下,需要對整個表進行鎖定以確保數據的完整性,傳統鎖機制可以很方便地實現這一點。

缺點對比

MVCC
  • 占用額外存儲空間

    • 為了保存數據的多個版本,MVCC 需要使用回滾段(undo log)來存儲舊版本信息,這會占用額外的磁盤空間。隨著數據的不斷更新和版本的增加,回滾段的空間開銷會逐漸增大,需要進行定期的清理和管理。

  • 回滾段管理開銷

    • 對回滾段的管理需要額外的系統資源和時間開銷。包括回滾段的分配、回收以及過期版本的清理等操作,都會影響數據庫的性能。如果回滾段管理不當,可能會導致性能下降或空間浪費。

  • 不支持完全序列化隔離

    • MVCC 不能完全實現序列化隔離級別,在某些情況下可能會出現幻讀問題。雖然在可重復讀隔離級別下可以避免大部分幻讀,但在極端情況下,仍然可能需要使用額外的鎖機制來解決幻讀問題。

傳統鎖機制
  • 低并發性能

    • 傳統鎖機制會導致讀寫操作之間的鎖競爭,當多個事務同時訪問相同的數據時,會出現大量的鎖等待現象,降低了數據庫的并發性能。例如,一個寫操作對數據加了排他鎖,其他事務的讀操作和寫操作都需要等待該鎖釋放,從而導致系統響應時間變長。

  • 死鎖風險高

    • 由于鎖的使用,多個事務之間可能會形成循環等待鎖的情況,從而導致死鎖的發生。死鎖的檢測和處理需要額外的系統開銷,并且會影響事務的正常執行,降低系統的可靠性。

  • 鎖粒度選擇困難

    • 選擇合適的鎖粒度是一個難題。如果鎖粒度太粗(如表鎖),會導致并發性能下降;如果鎖粒度太細(如行鎖),會增加鎖的管理開銷和死鎖的風險。在實際應用中,需要根據具體的業務場景和數據訪問模式來選擇合適的鎖粒度。

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

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

相關文章

從0到1:ArkTS實現鴻蒙策略模式全解析

策略模式初窺 策略模式&#xff08;Strategy Pattern&#xff09;是一種行為型設計模式&#xff0c;它定義了一系列算法&#xff0c;并將每個算法封裝起來&#xff0c;使它們可以相互替換&#xff0c;且算法的變化不會影響到使用算法的客戶端。在軟件開發中&#xff0c;策略模…

iOS AES/CBC/CTR加解密以及AES-CMAC

感覺iOS自帶的CryptoKit不好用&#xff0c;有個第三方庫CryptoSwift還不錯&#xff0c;好巧不巧&#xff0c;清理過Xcode緩存后死活下載不下來&#xff0c;當然也可以自己編譯個Framework&#xff0c;但是偏偏不想用第三方庫了&#xff0c;于是研究了一下&#xff0c;自帶的Com…

vue純靜態實現 視頻轉GIF 功能(附源碼)

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、實現后的效果二、使用步驟1.引入庫2.下載or復制出來js3. 前端實現 總結 前言 一天一個小demo 今天來一個vue純靜態實現 視頻轉GIF 功能 上一篇我們講到了…

因果機器學習(CausalML)前沿創新思路

結合了傳統因果推斷與機器學習的因果機器學習是目前AI領域的前沿研究方向&#xff0c;其核心優勢在于將因果邏輯融入數據驅動模型&#xff0c;從根本上解決了傳統方法的缺陷。因此&#xff0c;它也是突破傳統機器學習瓶頸的關鍵方向&#xff0c;不僅當下熱度高&#xff0c;在未…

【CubeMX+STM32】SD卡 U盤文件系統 USB+FATFS

本篇&#xff0c;將使用CubeMXKeil, 創建一個 USBTF卡存儲FatFS 的虛擬U盤讀寫工程。 目錄 一、簡述 二、CubeMX 配置 SDIO DMA FatFs USB 三、Keil 編輯代碼 四、實驗效果 串口助手&#xff0c;實現效果&#xff1a; U盤&#xff0c;識別效果&#xff1a; 一、簡述 上…

docker nginx 配置文件詳解

在平常的開發工作中&#xff0c;我們經常需要訪問靜態資源&#xff08;圖片、HTML頁面等&#xff09;、訪問文件目錄、部署項目時進行負載均衡等。那么我們就會使用到Nginx&#xff0c;nginx.conf 的配置至關重要。那么今天主要結合訪問靜態資源、負載均衡等總結下 nginx.conf …

Ubuntu 下 nginx-1.24.0 源碼分析 - ngx_atomic_cmp_set 函數

目錄 修正 執行 ./configure 命令時&#xff0c;輸出&#xff1a; checking for OS Linux 6.8.0-52-generic x86_64 checking for C compiler ... found using GNU C compiler gcc version: 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04) 所以當前環境是 x86_64 于是在 src…

在 Go 中實現事件溯源:構建高效且可擴展的系統

事件溯源&#xff08;Event Sourcing&#xff09;是一種強大的架構模式&#xff0c;它通過記錄系統狀態的變化&#xff08;事件&#xff09;來重建系統的歷史狀態。這種模式特別適合需要高可擴展性、可追溯性和解耦的系統。在 Go 語言中&#xff0c;事件溯源可以通過一些簡單的…

大數據Orc文件生成與讀取

ORC(Optimized Row Columnar)是Hadoop生態系統中一種高效的列式存儲文件格式,其主要特性包括高效壓縮、快速讀取、以及能夠存儲結構化數據。本文將展示如何使用Java編寫代碼來生成和讀取ORC文件。 一、ORC文件介紹 ORC是一種為Hadoop生態系統優化的列式存儲格式,具有以下…

解讀 Flink Source 接口重構后的 KafkaSource

前言 Apache Kafka 和 Apache Flink 的結合&#xff0c;為構建實時流處理應用提供了一套強大的解決方案[1]。Kafka 作為高吞吐量、低延遲的分布式消息隊列&#xff0c;負責數據的采集、緩沖和分發&#xff1b;而 Flink 則是功能強大的流處理引擎&#xff0c;負責對數據進行實時…

【推理llm論文精讀】DeepSeek V3技術論文_精工見效果

先附上原始論文和效果對比https://arxiv.org/pdf/2412.19437 摘要 (Abstract) DeepSeek-V3是DeepSeek-AI團隊推出的最新力作&#xff0c;一個強大的混合專家&#xff08;Mixture-of-Experts&#xff0c;MoE&#xff09;語言模型。它擁有671B的總參數量&#xff0c;但每個tok…

如何使用Java語言在Idea和Android中分別建立服務端和客戶端實現局域網聊天

手把手教你用Java語言在Idea和Android中分別建立服務端和客戶端實現局域網聊天 目錄 文章目錄 手把手教你用**Java**語言在**Idea**和**Android**中分別建立**服務端**和**客戶端**實現局域網聊天**目錄**[toc]**基本實現****問題分析****服務端**Idea:結構預覽Server類代碼解…

java韓順平最新教程,Java工程師進階

簡介 HikariCP 是用于創建和管理連接&#xff0c;利用“池”的方式復用連接減少資源開銷&#xff0c;和其他數據源一樣&#xff0c;也具有連接數控制、連接可靠性測試、連接泄露控制、緩存語句等功能&#xff0c;另外&#xff0c;和 druid 一樣&#xff0c;HikariCP 也支持監控…

如何在 IDE 里使用 DeepSeek?

近期&#xff0c;阿里云百煉平臺重磅推出 DeepSeek-V3、DeepSeek-R1、DeepSeek-R1-Distill-Qwen-32B 等 6 款模型&#xff0c;進一步豐富其 AI 模型矩陣。與此同時&#xff0c;通義靈碼也緊跟步伐&#xff0c;全新上線模型選擇功能&#xff0c;支持基于百煉的 DeepSeek-V3 和 D…

vue中附件下載及打印功能

1.附件dom 注&#xff1a;fileList是由后臺返回的附件數組&#xff0c;數組中包含附件名稱fileName,附件地址url&#xff0c;附件id等信息 <el-form-item label"附件" style"width: 100% !important;" v-if"modelTypeborrowDetail"><d…

chromium-mojo

https://chromium.googlesource.com/chromium/src//refs/heads/main/mojo/README.md 相關類&#xff1a;https://zhuanlan.zhihu.com/p/426069459 Core:https://source.chromium.org/chromium/chromium/src//main:mojo/core/README.md;bpv1;bpt0 embedder:https://source.chr…

網絡安全技術復習總結

1|0第一章 概論 1.網絡安全發展階段包括四個階段&#xff1a;通信安全、計算機安全、網絡安全、網絡空間安全。 2.2017年6月1日&#xff0c;我國第一部全面規范網絡空間安全的基礎性法律《中華人民共和國網絡安全法》正式實施。 3.2021年 6月10日&#xff0c;《中華人民共和…

基于華為云鏡像加速器的Docker環境搭建與項目部署指南

基于華為云鏡像加速器的Docker環境搭建與項目部署指南 一、安裝Docker1.1 更新系統包1.2 安裝必要的依賴包1.3 移除原有的Docker倉庫配置(如果存在)1.4 添加華為云Docker倉庫1.5 安裝Docker CE1.6 啟動Docker服務1.7 驗證Docker是否安裝成功1.8 添加華為云鏡像加速器地址二、…

在SpringBoot服務器端采購上,如何選擇操作系統、Cpu、內存和帶寬、流量套餐

在Spring Boot服務器端采購時&#xff0c;選擇操作系統、CPU、內存、帶寬和流量套餐需根據應用需求、預算和性能要求綜合考慮。以下是具體建議&#xff1a; 1. 操作系統 Linux發行版&#xff08;如Ubuntu、CentOS&#xff09;&#xff1a;適合大多數Spring Boot應用&#xff…

DedeBIZ系統審計小結

之前簡單審計過DedeBIZ系統&#xff0c;網上還沒有對這個系統的漏洞有過詳盡的分析&#xff0c;于是重新審計并總結文章&#xff0c;記錄下自己審計的過程。 https://github.com/DedeBIZ/DedeV6/archive/refs/tags/6.2.10.zip &#x1f4cc;DedeBIZ 系統并非基于 MVC 框架&…