mysql5.7系列-InnoDB的MVCC實現原理

談到數據庫事務都要提一下ACID 特性:

原子性(Atomicity):事務中的操作要么全部執行,要么全部不執行。

一致性(Consistency):事務執行前后,數據庫的狀態必須是一致的。

隔離性(Isolation):一個事務的執行不應受其他事務的干擾,每個事務都應有自己的數據視圖。

持久性(Durability):一旦事務提交,其結果就會永久保存。

什么是mvcc

mvcc全稱Multi-Version Concurrency Control ,多版本并發控制,顧名思義是維持了數據庫中數據的多版本;這個機制主要是為了服務事務隔離級別中的READ COMMITTED和REPATEABLE READ兩種隔離級別在多個事務讀取數據的時候能遵守sql標準。

本質:就是通過Read View + Undo Log來實現的,Undo Log中保存了歷史快照,而Read View 用來判斷具體哪一個快照是可見的。

下面具體介紹下,什么是 Undo Log和Read View:

什么是Undo Log

undo log是innodb引擎的一種日志,在事務的修改記錄之前,會把該記錄的原值(before image)先保存起來(undo log)再做修改,以便修改過程中出錯能夠恢復原值或者其他的事務讀取。

數據庫中的每行記錄中,除了保存了我們自己定義的一些字段以外,還有一些重要的隱式字段的:

● db_row_id:隱藏主鍵,如果我們沒有給這個表創建主鍵,那么會以這個字段來創建聚簇索引。

● db_trx_id:對這條記錄做了最新一次修改的事務的ID

● db_roll_ptr:回滾指針,指向這條記錄的上一個版本,其實他指向的就是Undo Log中的上一個版本的快照的地址。

因為每一次記錄變更之前都會先存儲一份快照到undo log中,那么這幾個隱式字段也會跟著記錄一起保存在undo log中,就這樣,每一個快照中都有一個db_trx_id字段表示了對這個記錄做了最新一次修改的事務的ID ,以及一個db_roll_ptr字段指向了上一個快照的地址。這樣就產生了一個版本快照鏈,如下:

什么是Read View

在 RC或者RR事務隔離級別下,當前事務產生select查詢時就會產生read view, RC是每次select都會產生一個read view, RR是只在第一次select的時候產生一個read view 后面的select都是使用這個read view

ReadView 中主要包含4個比較重要的內容:

  • m_ids :表示在生成ReadView 時當前系統中活躍的讀寫事務的事務id 列表。
  • min_trx_id :表示在生成ReadView 時當前系統中活躍的讀寫事務中最小的事務id ,也就是m_ids 中的最小值。
  • max_trx_id :表示生成ReadView 時系統中應該分配給下一個事務的id 值。

小貼士: 注意max_trx_id并不是m_ids中的最大值,事務id是遞增分配的。比方說現在有id為1,2,3這三個事務,之后id為3的事務提交了。那么一個新的讀事務在生成ReadView時,m_ids就包括1和2,min_trx_id的值就是1,max_trx_id的值就是4。

  • creator_trx_id :表示生成該ReadView 的事務的事務id 。小貼士: 我們前邊說過,只有在對表中的記錄做改動時(執行INSERT、DELETE、UPDATE這些語句時)才會為事務分配事務id,否則在一個只讀事務中的事務id值都默認為0。

而判斷數據記錄可見性的邏輯就是通過readview和【行記錄的隱藏字段trx_id】做對比的

一個事務去訪問記錄的時候,怎么判斷記錄的可見性呢?

Read View決定當前事務能讀到哪個版本的數據,從表記錄到Undo Log歷史數據的版本鏈,依次匹配,滿足哪個版本的匹配規則,就能讀到哪個版本的數據,一旦匹配成功就不再往下匹配。

遵循了以下可見性匹配規則:

規則說明:

  • trx_id = creator_trx_id:如果 trx_id 值等于創建Read View的事務Id,那么數據記錄的最后一次操作的事務就是當前事務,該版本的記錄對當前事務可見
  • trx_id < min_trx_id:如果 trx_id 值小于 Read View 中的 min_trx_id ,表示這個版本的記錄是在創建 Read View 已經提交的事務生成的,所以該版本的記錄對當前事務可見
  • trx_id >= max_trx_id:如果trx_id 值小于 Read View 中的 min_trx_id ,表示這個版本的記錄是在創建 Read View 才啟動的事務生成的,所以該版本的記錄對當前事務不可見
  • min_trx_id <= trx_id < max_trx*id:判斷 *trx_id 是不是在當前事務ID集合(m_ids)里面
  • 如果在m_ids中,則代表Read View生成時刻,這個事務還在活躍,還沒有Commit,版本記錄在前事務不可見
  • 如果不在m_ids中,則說明,這個事務在Read View生成之前就已經Commit了,版本記錄在前事務可見

mvcc有什么作用

1.解決臟讀問題:一個事務中的每一次SELECT都會重新獲取一次Read View。

2.解決不可重復讀問題:一個事務中只在第一次SELECT的時候會獲取一次Read View。

3.解決部分幻讀問題:mvcc+間隙鎖可以解決部分幻讀問題,但是不能完全解決。

參考資料

https://dev.mysql.com/doc/refman/5.7/en/innodb-consistent-read.html

https://www.cnblogs.com/ykmStudy/p/17765346.html

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

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

相關文章

力扣-287.尋找重復數

題目鏈接 287.尋找重復數 class Solution {public int findDuplicate(int[] nums) {int low nums[0];int fast nums[nums[0]];//1.快慢指針找相遇點while (low ! fast) {low nums[low];fast nums[nums[fast]];}//2.雙指針找入環點int pre 0;while (pre ! low) {pre num…

Java 大視界 -- Java 大數據在智能教育個性化學習計劃制定與動態調整中的應用(338)

Java 大視界 -- Java 大數據在智能教育個性化學習計劃制定與動態調整中的應用&#xff08;338&#xff09; 引言&#xff1a;正文&#xff1a;一、Java 構建的學習行為數據采集與分析體系1.1 全場景數據接入引擎1.2 家校協同數據交互模塊1.3 學習特征提取與建模 二、Java 驅動的…

uniapp返回webview返回小程序并且跳轉回webview

webview頁面提示&#xff1a;wx一定要導入sdk// 返回小程序&#xff0c;并攜帶當前 WebView 的 URL 和狀態wx.miniProgram.postMessage({type: requestPayment,data: {webviewUrl: window.location.href,orderNum: this.orderNum,type: requestPayment}})setTimeout(() > {w…

[java: Cleaner]-一文述之

Cleaner Cleaner 是 Java 9 引入的資源清理機制&#xff0c;用于在對象被垃圾回收后自動或手動執行清理操作&#xff0c;替代 finalize()&#xff0c;安全、異步且高效。 public final class Cleaner {final CleanerImpl impl;static {CleanerImpl.setCleanerImplAccess(new Fu…

知識庫中如何確實嵌入文本塊大小?語義完整性與檢索顆粒度的平衡機制

一、文本塊大小確定的理論基礎與歷史演進 1.1 概念起源與發展脈絡 文本塊&#xff08;Text Chunk&#xff09; 這一概念最初源于信息檢索領域的實踐需求。早期的全文檢索系統面臨著一個根本性矛盾&#xff1a;如何在保持文檔語義完整性的同時&#xff0c;實現高效的信息定位。這…

C/C++ 實現在快速排序Quick Sort中的三種分區方式

1. 簡介神說, 要有光. 于是就有了光. 神說要有快排, 于是就有了快排. 快速排序Quick Sort的發明者 托尼 霍爾 是1980年的圖靈獎得主. 快速排序就是他發明的. 當時發明的背景是: 由于霍爾要高效地對俄語詞匯進行排序以優化翻譯程序, 而當時的排序算法(如冒泡, 插入排序)效率較低…

Flink TiDB CDC 環境配置與驗證

一、TiDB 數據庫核心配置 1. 啟用 TiCDC 服務 確保 TiDB 集群已部署 TiCDC 組件&#xff08;版本需兼容 Flink CDC 3.0.1&#xff09;&#xff0c;并啟動同步服務&#xff1a; # 示例&#xff1a;啟動 TiCDC 捕獲 changefeed cdc cli changefeed create \--pd"localhos…

2025年數據挖掘與計算機科學國際會議 (DMCS 2025)

2025 International Conference on Data Mining and Computer Science【一】、大會信息 會議簡稱&#xff1a;DMCS 2025 大會地點&#xff1a;中國廣州 收錄檢索&#xff1a;提交Ei Compendex,CPCI,CNKI,Google Scholar等【二】會議簡介2025年數…

騰訊輕量云和云服務器的區別

從問題本身來看&#xff0c;用戶應該對云計算有基本了解&#xff0c;但可能不太清楚騰訊云產品線的細分定位。這類問題通常出現在項目初期技術選型階段&#xff0c;用戶需要權衡成本和性能。 讓我先梳理兩者的核心差異點。輕量云本質是面向輕量級應用的打包解決方案&#xff0c…

在使用ffmpeg時遇到了復制路徑在終端輸入指令后,報錯的解決方法

錯誤如下所示&#xff1a;解決方法&#xff1a;??檢查路徑中的特殊字符??&#xff1a;你的路徑中包含了一個不可見的Unicode字符&#xff08;?&#xff0c;即LEFT-TO-RIGHT MARK&#xff09;&#xff0c;這是從網頁復制路徑時常見的隱藏字符??解決方案??&#xff1a;直…

高頻變壓器材料新解:納米晶的渦流損耗逆襲之路

通過帶材做薄納米晶&#xff0c;可以降低渦流損耗。原因有二&#xff1a;一、納米晶做薄可以減小磁場的趨膚效應&#xff1b;二、納米晶越薄材料電阻越高&#xff0c;整體電阻越大&#xff0c;渦流損耗越小。本篇&#xff0c;就來詳細談談變壓器的渦流損耗。 鐵氧體材料成本低&…

DMA技術與音頻數據的存儲和播放

基本概念 采樣率: 每秒采集的采樣點次數。如480000HZ, 就是我們常見的48KHZ采樣點(Sample):每一個采樣點代表一個時間點的聲音幅度值。對于立體聲,每個采樣點包含了兩個聲道(左聲道,右聲道)的數據。幀:一幀就是一個時刻采集的數據,如果音頻是立體聲則會產生2個采樣點,如…

項目進度受外包團隊影響,如何管控交付節奏

項目進度受外包團隊影響時&#xff0c;管控交付節奏的關鍵措施包括明確交付標準與節點、建立可視化進度監控機制、強化合同約束與激勵條款、保持高頻溝通與快速響應機制、建立聯合質量審查機制。其中&#xff0c;明確交付標準與節點最為關鍵。通過制定具體、可量化的交付標準與…

BM9 刪除鏈表的倒數第n個節點

目錄 題目鏈接 題目 解題思路 代碼 題目鏈接 刪除鏈表的倒數第n個節點_牛客題霸_牛客網 題目 解題思路 先利用快慢指針找到刪除位置的前一個節點,然后進行刪除即可(具體就是快指針先移動n1個,因為要找到刪除指針的前一個節點) 代碼 import java.util.*;/** public clas…

java中ehcache因為可以緩存到本地,假如生產環境使用ehcache是不是需要在生產環境服務器創建緩存文件夾目錄以存儲ehcache緩存的數據

是的&#xff0c;當在生產環境中使用 Ehcache 的磁盤持久化功能時&#xff0c;確實需要在服務器上創建相應的緩存文件夾目錄&#xff0c;并確保應用程序有權限讀寫該目錄。 以下是詳細說明和配置建議&#xff1a;1. 為什么需要創建緩存目錄&#xff1f;Ehcache 的磁盤持久化功能…

day55

1. 序列預測介紹序列預測就是根據過去的序列數據&#xff08;比如時間順序的數據&#xff09;&#xff0c;預測未來的結果。? 單步預測&#xff1a;只預測下一個時刻的值。比如根據前7天的氣溫&#xff0c;只預測第8天的氣溫。? 多步預測的2種方式&#xff1a;? 遞歸式&…

javaweb———html

我才開始學javaweb&#xff08;重點不在這&#xff09;可能學的比較慢&#xff0c;勿說HTML 基礎結構HTML 文檔的基本結構包含 <!DOCTYPE html> 聲明、<html> 根元素、<head> 頭部和 <body> 主體部分。<head> 中包含頁面元信息&#xff0c;如標題…

OpenCV在Visual Studio 2022下的配置

OpenCV是一個開源的計算機視覺和機器學習軟件庫&#xff0c;廣泛應用于圖像處理、目標檢測、模式識別等領域。它通常搭配在Visual Studio集成開發環境中使用&#xff0c;配置步驟主要有下載安裝、加入系統環境變量、設置VS項目屬性等。 1. 下載安裝 a) 進入OpenCV官網&#xf…

kafka如何讓消息均勻的寫入到每個partition

在Kafka中,要實現消息均勻寫入每個partition,核心是通過合理的分區分配策略讓消息在partition間均衡分布。具體機制和實踐方式如下: 一、Kafka默認的分區分配邏輯(核心機制) Kafka生產者發送消息時,通過Partitioner接口(默認實現為DefaultPartitioner)決定消息寫入哪…

centos7修改yum源并安裝Ansible

1、修改yum源在 CentOS 系統中&#xff0c;將默認的 yum 源修改為阿里云的鏡像源&#xff0c;可以加快軟件包的下載速度。以下是詳細步驟&#xff1a;1&#xff09;備份原有的 yum 源配置sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup2…