講解Mysql InnoDB的MVCC

1. 定義

????????MVCC是多版本并發控制(Multi - Version Concurrency Control)的縮寫。它是InnoDB存儲引擎實現高并發控制的一種機制。在數據庫系統中,多個事務可能會同時對數據進行讀寫操作,而MVCC通過為數據行保存多個版本來解決并發事務之間的沖突問題,使得數據庫在保證數據一致性的同時,能夠支持更多的并發操作。MVCC的核心思想是:為每一行數據維護多個版本,使得讀寫操作可以并發執行而不互相阻塞。

2. 事務和事務ID

????????在InnoDB中,事務是MVCC的核心。每個事務在開始時都會被分配一個唯一的事務ID(Transaction ID,簡稱TXID)。事務ID是單調遞增的,用于標識事務的先后順序。

  • 事務ID的作用

    • 事務ID用于標記數據版本的創建者和可見性。

    • 事務ID用于判斷事務之間的先后順序,從而實現并發控制。

3. 數據版本的存儲結構?

????????InnoDB使用行版本控制來實現MVCC。每行數據在物理存儲上可能有多個版本,這些版本通過隱藏的列和指針進行管理。

  • 隱藏列

    • DB_TRX_ID(事務ID):記錄最后一次對該行進行修改的事務的ID。這個ID是遞增的,每次事務開始時都會分配一個唯一的事務ID。當一個事務對數據行進行修改時,InnoDB會將這個事務的ID記錄在DB_TRX_ID列中。

    • DB_ROLL_PTR(回滾指針):回滾指針指向該行數據的舊版本。舊版本數據存儲在InnoDB的回滾段(Undo Log)中。Undo Log是InnoDB用來存儲數據行舊版本的地方,它記錄了數據行在各個事務修改前的狀態。

    • DB_ROW_ID:行ID,用于唯一標識一行數據。

  • 版本鏈

    • 每行數據的多個版本通過DB_ROLL_PTR鏈接在一起,形成一個版本鏈。

    • 最新的版本存儲在表空間中,舊版本存儲在回滾段(Undo Log)中。

  • ReadView:

    ???決定當前事務能看到哪些版本的數據,包含:?
    • m_ids:當前活躍(未提交)事務ID列表。

    • min_trx_id:m_ids中的最小值。

    • max_trx_id:下一個將分配的事務ID。

    • creator_trx_id:創建該ReadView的事務ID。

4. MVCC的可見性規則

????????InnoDB通過事務ID和版本鏈來判斷數據版本的可見性。具體規則如下:

4.1 讀操作的可見性規則

  • 一致性讀(Consistent Read)

    • 默認情況下,InnoDB使用一致性讀,即讀取數據時會看到事務開始時的數據庫快照。

    • 事務只能看到在它開始之前已經提交的版本,或者它自己插入的版本。

    • 事務不能看到在它開始之后其他事務插入或更新的版本。

  • 活躍事務是指在當前事務開始時仍然在運行的事務。換句話說,這些事務可能尚未提交或回滾。

    示例:假設當前數據庫中有以下事務:
    • 事務ID為102的事務也正在運行。

    • 事務ID為101的事務正在運行(尚未提交或回滾)。

    • 事務ID為100的事務已經提交。

    • 現在,一個新的事務(事務ID為103)開始執行。對于事務103來說:

    • 活躍事務:事務ID為101102的事務,因為它們在事務103開始時仍在運行。

    • 非活躍事務:事務ID為100的事務,因為它在事務103開始之前已經提交。

  • 快照讀的判斷邏輯

    • 數據版本:記錄了每條記錄在不同時間點的狀態。

    • 活躍事務:記錄了在當前事務開始時仍在運行的事務。

    • 如果一個數據版本的DB_TRX_ID小于當前事務的最小活躍事務ID

      • 這個版本是由一個已經提交的事務生成的,對當前事務可見。

    • 如果一個數據版本的DB_TRX_ID大于當前事務的最大活躍事務ID

      • 這個版本是由一個在當前事務開始之后才開始的事務生成的,對當前事務不可見。

    • 如果一個數據版本的DB_TRX_ID在當前事務的活躍事務列表中

      • 這個版本是由一個仍在運行的事務生成的,對當前事務不可見。需要回溯到舊版本,繼續判斷,直到找到一個符合上述條件的版本。

4.2 寫操作的可見性規則

  • 當前讀(Current Read)

    • 寫操作(如INSERT、UPDATE、DELETE)會獲取行鎖,并直接操作最新的數據版本。

    • 寫操作會生成新的數據版本,并更新DB_TRX_ID為當前事務ID。

    • 如果是更新操作,舊版本會被移動到回滾段中,并通過DB_ROLL_PTR鏈接。

5.?事務的隔離級別與MVCC

????????InnoDB支持多種事務隔離級別,不同隔離級別對MVCC的實現方式和可見性規則有所不同。

4.1 讀已提交(Read Committed)

  • 特點

    • 事務只能看到在它開始之前已經提交的版本。

    • 每次讀取數據時,InnoDB都會重新構建一個快照。

    • 不允許讀取未提交的版本,避免了“臟讀”問題。

  • MVCC實現

    • 對于每個SELECT操作,InnoDB會根據當前事務的讀視圖,找到最新的已提交版本。

    • 如果數據被其他事務鎖定,當前事務會等待鎖釋放。

5.2 可重復讀(Repeatable Read)

  • 特點

    • 事務在執行期間看到的數據庫快照是一致的,即使其他事務在并發修改數據。

    • 避免了“不可重復讀”問題。

  • MVCC實現

    • 事務開始時,InnoDB會創建一個快照視圖,后續的讀操作都基于這個快照。

    • 事務只能看到在它開始之前已經提交的版本,或者它自己插入的版本。

    • 如果其他事務在并發修改數據,當前事務不會看到這些修改,除非它自己也進行了修改。

5.3 串行化(Serializable)

  • 特點

    • 最嚴格的隔離級別,事務之間完全隔離。

    • 避免了所有并發問題,但性能開銷最大。

  • MVCC實現

    • 除了使用MVCC的版本控制外,還會通過加鎖機制(如表鎖或行鎖)來確保事務之間的串行執行。

    • 讀操作也會加鎖,防止其他事務修改數據。

6. 回滾段(Undo Log)的作用

????????回滾段是InnoDB實現MVCC的關鍵組件之一。它用于存儲數據的舊版本,以便支持一致性讀和事務回滾。

  • 存儲舊版本

    • 當事務更新數據時,舊版本會被移動到回滾段中,并通過DB_ROLL_PTR鏈接。

    • 回滾段中的舊版本數據用于支持一致性讀,事務可以根據需要回溯到舊版本。

  • 事務回滾

    • 如果事務需要回滾,InnoDB會通過回滾段中的舊版本數據恢復到事務開始之前的狀態。

  • 垃圾回收

    • 當沒有事務再需要回滾段中的舊版本數據時,InnoDB會進行垃圾回收,釋放回滾段的空間。

7.?總結

? ? ? ? InnoDB的MVCC機制是一種高效的并發控制機制,它通過為數據行保存多個版本,實現了讀操作和寫操作之間的高并發性,減少了鎖競爭,并保證了事務的一致性讀。然而,MVCC機制也存在一些局限性,如版本鏈過長、垃圾回收問題和快照隔離級別下的幻讀問題。盡管如此,InnoDB的MVCC機制仍然是現代數據庫系統中一種重要的并發控制機制,廣泛應用于各種高并發的場景中。

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

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

相關文章

ZeroMQ Sockets介紹及應用示例

1. 概念解釋 ZeroMQ Sockets提供了一種類標準套接字(socket-like)的 API,是消息導向的通信機制,基于 TCP/UDP 等傳輸層協議,但封裝了底層細節(如連接管理、消息路由、緩沖區等),提供…

語音合成之十五 語音合成(TTS)分句生成拼接時的響度一致性問題:現狀、成因與對策

語音合成(TTS)分句生成拼接時的響度一致性問題:現狀、成因與對策 引言:分段式文本轉語音中的響度一致性挑戰業界對響度差異問題的認知拼接語音片段中響度變化的根本原因分段拼接的固有挑戰各片段預測韻律特征的差異文本特征和模型…

Android中Binder驅動作用?

Binder驅動的作用與核心功能 Binder驅動是Android系統中實現進程間通信(IPC)的核心底層組件,它工作于Linux內核層,負責管理跨進程通信的建立、數據傳輸、資源同步等關鍵任務。以下是其核心作用及實現細節: 1. ??進程…

網絡學習-TCP協議(七)

一、TCP協議 TCP(Transmission Control Protocol,傳輸控制協議)是一種面向連接的、可靠的、基于字節流的傳輸層通信協議。 1、三次握手 客戶端: 1、先發起連接,發送SYN置1,seqnum12345(隨機值)----半連接…

【Python 基礎與實戰】從基礎語法到項目應用的全流程解析

(1)列表和元組的區別是什么?如何從列表創建元組?如何從元組創建列表? 列表和元組的區別: 可變性:列表是可變的,即可以對列表進行元素的增、刪、改操作。例如,可以使用append()方法添加元素,r…

Docker部署Zookeeper集群

簡介 ZooKeeper 是一個開源的分布式協調服務,由 Apache 軟件基金會開發和維護。它主要用于管理和協調分布式系統中的多個節點,以解決分布式環境下的常見問題,如配置管理、服務發現、分布式鎖等。ZooKeeper 提供了一種可靠的機制,…

【學習筆記】Sophus (Python) 使用文檔

以下是一份針對 Sophus 庫的 Python 使用文檔,涵蓋基礎概念、安裝方法、核心功能及代碼示例。內容圍繞 SO3(3D旋轉群)和 SE3(3D剛體變換群)展開,適合機器人學、SLAM、三維幾何等領域。 Sophus (Python) 使用…

計算機圖形學:(三)MVP變換擴展

Three.js WebGL允許把JavaScript和OpenGL 結合在一起運用,但使用WebGL原生的API來寫3D程序非常的復雜,同時需要相對較多的數學知識,對于前端開發者來說學習成本非常高。 Three.js是基于webGL的封裝的一個易于使用且輕量級的3D庫,T…

MySQL數據庫操作合集

一、SQL通用語法 ①SQL語句可以單行或多行書寫,以分號結尾。 ②SQL語句可以使用空格/縮進來增強語句可讀性。 ③MySQL數據庫的SQL語句不區分大小寫,關鍵字建議使用大寫。 ④注釋: 單行注釋: -- 注釋內容 或 # 注釋內容&#…

傳統工程項目管理與業財一體化管理的區別?

在工程項目管理領域,傳統管理模式與新興的業財一體化管理模式正在形成鮮明對比。隨著數字化轉型的加速,工程行業對高效、透明、協同的管理需求日益迫切。傳統工程項目管理依賴人工操作、分散系統和分模塊管理,難以應對復雜項目的全生命周期需…

敦煌網測評從環境搭建到風控應對,精細化運營打造安全測評體系

自養號測評,搶占流量為快速提升產品權重和銷量,很多賣家常采用自己養號補單測評的方式,技術搭建需要很多要素 一、硬件參數的關聯性 在我們使用設備進行注冊或操作賬號的過程中,系統會記錄下大量的系統與網絡參數,其中…

redis Pub/Sub 簡介 -16 (PUBLISH、SUBSCRIBE、PSUBSCRIBE)

Redis Pub/Sub 簡介:PUBLISH、SUBSCRIBE、PSUBSCRIBE Redis Pub/Sub 是一種強大的消息傳遞范例,可在應用程序的不同部分之間實現實時通信。它是構建可擴展和響應式系統的基石,允許組件在沒有直接依賴的情況下進行交互。本章將全面介紹 Redis…

JavaSE核心知識點03高級特性03-01(集合框架)

🤟致敬讀者 🟩感謝閱讀🟦笑口常開🟪生日快樂?早點睡覺 📘博主相關 🟧博主信息🟨博客首頁🟫專欄推薦🟥活動信息 文章目錄 JavaSE核心知識點03高級特性03-01&#xff0…

日志分析-IIS日志分析

環境準備 https://xj.edisec.net/challenges/115 題目要求 windows系統中才有的IIS服務 既然是windows平臺,當然需要rdp登錄,在ssh登錄失敗 解題過程 phpstudy--2018站點日志.(.log文件)所在路徑,提供絕對路徑 Windows服務的日志一般有固定…

一、web安全基礎入門

1、Windows命令 文件和目錄操作 dir:列出當前目錄下的文件和子目錄。cd:切換目錄,例如 cd C:\Users 切換到C盤的Users目錄。md 或 mkdir:創建新目錄,如 md testdir。rd 或 rmdir:刪除空目錄,例…

動態規劃應用場景 + 代表題目清單(模板加上套路加上題單)

1. 序列型DP(Sequence DP) ? 應用場景 單個或多個序列(數組/字符串),求最優子結構。 常見問題:最長遞增子序列、最長公共子序列、回文子序列。 🧠 套路總結 單序列:dp[i] max(…

Linux iSCSI存儲共享實驗指南

實驗介紹 1、在Linux平臺上通過iSCSI協議實現IP-SAN存儲共享 2、掌握存儲導出(export)和存儲導入(import)的配置方法 3、學習iSCSI存儲的發現、連接、斷開和管理操作 1、實驗環境 兩臺同網段的Linux虛擬機(無需物理交換機) 操作系統:Lin…

從 Docker 到 runC

從 Docker 到 runC:容器底層原理詳解 目錄 1. Docker 與 runC 的關系 2. Docker 的核心組件 3. runC 的核心功能 4. 實戰示例:從 Docker 到 runC 4.1 示例場景:運行一個簡單容器 4.2 Docker 底層調用 runC 的流程 4.3 查看 runC 的調用 4.4 直接調用 runC 創建容器 …

使用Python在PowerPoint中插入形狀(Shape)

在進行演示文稿設計時,形狀(Shape)不僅可以增強視覺效果,還可以用于展示流程圖、標注、數據圖示等。借助Python,我們可以通過代碼快速批量地在PPT中添加各種形狀,提升設計效率。本文將介紹如何使用Python向…

Windows系統下MySQL 8.4.5壓縮包安裝詳細教程

一、MySQL 8.4.5新特性概覽 相較于舊版本,MySQL 8.4.5在性能與功能上實現了顯著提升: 性能優化:官方測試顯示,在高并發場景下,其讀寫性能較5.7版本提升近2倍,尤其在處理熱點數據競爭問題時表現更為出色。…