MVCC底層原理實現

MVCC的實現原理

了解實現原理之前,先理解下面幾個組件的內容

1、 當前讀和快照讀

先普及一下什么是當前讀和快照讀。

當前讀:讀取數據的最新版本,并對數據進行加鎖。

例如:insert、update、delete、select for update、 select lock in share mode。

快照讀:讀取數據的歷史版本,不對數據加鎖。

例如:select

最重要概念: MVCC原理是基于Undo Log、隱藏字段、Read View(讀視圖)實現的。

2、隱藏字段

MySQL的隱藏字段,當我們創建一張表時,InnoDB引擎會增加3個隱藏字段。

  • DB_TRX_ID(最近一次提交事務的ID):修改表數據時,都會提交事務,每個事務都有一個唯一的ID,這個字段就記錄了最近一次提交事務的ID。
  • DB_ROLL_PTR(上個版本的地址):修改表數據時,舊版本的數據都會被記錄到Undo Log日志中,每個版本的數據都有一個版本地址。這個字段記錄的就是上個版本的地址。
  • DB_ROW_ID(隱藏主鍵):如果表中沒有主鍵會默認生成該隱藏主鍵。
3、Undo log版本鏈

Undo log日志詳解:主要被用到了快照讀這一個階段

在這里插入圖片描述
undo log版本鏈示意圖:

在這里插入圖片描述
過程:

  1. 第一次事務進行更新數據時候,首先會在 undo log版本鏈 記錄原來數據的舊版本,以及該版本的指針,然后進行更新操作,此時會修改DB_TRX_ID為最近一次修改數據的事務ID,DB_ROLL_PTR指向上一次版本數據的指針,這樣不斷有事務更新該數據時候,表記錄和 undo log 歷史數據就組成了一個版本鏈。
4、Read View(讀視圖)

在事務中,執行SQL查詢,就會生成一個讀視圖,它是快照讀 SQL執行時MVCC提取數據的依據,記錄并維護系統當前活躍的事務 id

快照讀一般是讀取的歷史版本的讀視圖, 當前圖 會生成一個最新版本的讀視圖。

讀視圖是基于下面幾個字段實現的:

  • m_ids:當前系統中活躍的事務ID集合,即未提交的事務ID集合。

  • min_trx_id:m_ids中最小的ID

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

  • creator_trx_id: 當前事務ID

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

數據可見性規則:

在這里插入圖片描述

當一個匹配可以訪問該數據的時候就可以進行數據提取了,也就是直接返回查詢數據

5、不同隔離級別下可見性分析

在不同的事務隔離級別下,生成讀視圖的規則不同:

READ COMMITTED(讀已提交) :在事務中每一次執行快照讀都生成一個讀視圖,每個讀視圖中四個字段的值都是不同的。

REPEATABLE READ(可重復讀) :僅在事務中第一次執行快照讀時生成讀視圖,后續復用這個讀視圖

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

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

相關文章

python實現http文件服務器訪問下載

//1.py import http.server import socketserver import os import threading import sys# 獲取當前腳本所在的目錄 DIRECTORY os.path.dirname(os.path.abspath(__file__))# 設置服務器的端口 PORT 8000# 自定義Handler,將根目錄設置為腳本所在目錄 class MyHTT…

Cpp::靜態 動態的類型轉換全解析(36)

文章目錄 前言一、C語言中的類型轉換二、為什么C會有四種類型轉換?內置類型 -> 自定義類型自定義類型 -> 內置類型自定義類型 -> 自定義類型隱式類型轉換的坑 三、C強制類型轉換static_castreinterpret_castconst_castdynamic_cast 四、RTTI總結 前言 Hell…

2024年終總結:技術成長與突破之路

文章目錄 前言一、技術成長:菜鳥成長之路1. 學習與實踐的結合2. 技術分享與社區交流 二、生活與事業的平衡:技術之外的思考1. 時間管理與效率提升2. 技術對生活的積極影響 三、突破與展望:未來之路1. 技術領域的突破2. 未來規劃與目標 四、結…

ComfyUI實現老照片修復——AI修復老照片(ComfyUI-ReActor / ReSwapper)解決天坑問題及加速pip下載

AI修復老照片,試試吧,不一定好~~哈哈 2023年4月曾用過ComfyUI,當時就感慨這個工具和虛幻的藍圖很像,以后肯定是專業人玩的。 2024年我寫代碼去了,AI做圖沒太關注,沒想到,現在ComfyUI真的變成了工…

思科交換機telnet配置案例

目錄 1.telnet簡述2.網絡拓撲3.設備說明4.網絡配置4.1 電腦PC ip設置4.2 網絡交換機telnet配置 5.小結 1.telnet簡述 Telnet是遠程登錄服務的一個協議,該協議定義了遠程登錄用戶與服務器交互的方式。它允許用戶在一臺聯網的計算機上登錄到一個遠程分時系統中&#…

WPS數據分析000006

一、排序 開始→ 排序 同文件→選項→自定義序列→輸入序列 二、篩選 高級篩選 條件區域要與列表區域一樣。 三、條件格式

vofa++使用方法

控件區可以添加控件用來啊多樣顯示 點擊一個控件然后右鍵可以選擇要添加顯示的數據,點all表全部顯示, 點auto可以自動布局 要用控件需要選擇協議,不知道協議具體格式可以點擊問號看看,并且最好用printf重定義來實現 比如我要實現F…

達夢拷貝DM_HOME的復制安裝

近期一個項目需求,需要在沒有安裝包的情況下,將達夢數據庫安裝到虛機上(生產機上安裝了達夢),故采用直接打包生產機DM_HOME的方式拷貝至虛機,再依次執行達夢的部分指令完成安裝。以下為驗證的步驟&#xff…

tomcat的accept-count、max-connections、max-threads三個參數的含義

tomcat的accept-count、max-connections、max-threads三個參數的含義 tomcat的accept-count、max-connections、max-threads三個參數的含義 max-connections:最大連接數 最大連接數是指,同一時刻,能夠連接的最大請求數 需要注意的是&#x…

ui文件轉py程序的工具

源博客連接: PyCharm中利用外部工具uic轉成的py文件,里面全是C代碼,并非python類型的代碼,導致大量報錯。。。_pyside6-uic為什么把ui轉為了c-CSDN博客 如果想把ui文件轉為py文件,首先設置pycharm的外部工具&#xf…

hedfs和hive數據遷移后校驗腳本

先談論校驗方法,本人騰訊云大數據工程師。 1、hdfs的校驗 這個通常就是distcp校驗,hdfs通過distcp遷移到另一個集群,怎么校驗你的對不對。 有人會說,默認會有校驗CRC校驗。我們關閉了,為什么關閉?全量遷…

61,【1】BUUCTF WEB BUU XSS COURSE 11

進入靶場 左邊是吐槽,右邊是登錄,先登錄試試 admin 123456 admiin# 123456 admin"# 123456 不玩了,先去回顧下xss 回顧完就很尷尬了,我居然用SQL的知識去做xss的題 重來 吐槽這里有一個輸入框,容易出現存儲型…

海外問卷調查如何影響企業的經營?在品牌建設中有何指導意義?

市場調查的定義:通過科學的方法,有目的地、系統地搜集整理一些市場信息,其目的在于了解當下市場現狀和發展前景,為企業生產和品牌打造提供一些科學的指導意見,這是任何大企業、中小企業、初創企業都必須重視的一個重要…

STM32新建不同工程的方式

新建工程的方式 1. 安裝開發工具 MDK5 / keil52. CMSIS 標準3. 新建工程3.1 寄存器版工程3.2 標準庫版工程3.3 HAL/LL庫版工程3.4 HAL庫、LL庫、標準庫和寄存器對比3.5 庫開發和寄存器的關系 4. STM32CubeMX工具的作用 1. 安裝開發工具 MDK5 / keil5 MDK5 由兩個部分組成&#…

idea maven本地有jar包,但還要從遠程下載

idea 中,java 工程執行 maven reimport,報jar報無法下載。 我奇了個怪,我明明在本地倉庫有啊,你非得從遠程下載? 我從供應商那里拿來的,遠程當然沒有了。 這太奇葩了吧,折騰好久不行。 后來…

springboot 調用 c++生成的so庫文件

一、創建c文件 SoTest.h #pragma once class SoTest {int Add(int a,int b); };SoTest.cpp #include "SoTest.h"int SoTest::Add(int a, int b) {return a b; }二、創建so文件 /home/ubuntu/projects/SoTest/bin/x64/Debug/libSoTest.so 三、java代碼 Maven依…

Windows 靶機常見服務、端口及枚舉工具與方法全解析:SMB、LDAP、NFS、RDP、WinRM、DNS

在滲透測試中,Windows 靶機通常會運行多種服務,每種服務都有其默認端口和常見的枚舉工具及方法。以下是 Windows 靶機常見的服務、端口、枚舉工具和方法的詳細說明: 1. SMB(Server Message Block) 端口 445/TCP&…

250125-package

1. 定義 包就是文件夾,作用是在大型項目中,避免不同人的編寫的java文件出現同名進而導致報錯;想象一個場景,在一個根目錄中,每一個人都有自己的一個java文件夾,他可以將自己編寫的文件放在該文件夾里&…

系統思考—動態問題分析

“不是解決問題,而是根本改變它的方式,才能真正創造持久的成功。”——彼得德魯克 在很多情況下,企業面對問題時,總會急于尋找解決方案,但這些方案往往只是暫時的“應急措施”。它們看似有效,卻難以從根本…

ASP.NET Core WebAPI的異步及返回值

目錄 Action方法的異步 Action方法參數 捕捉URL占位符 捕捉QueryString的值 JSON報文體 其他方式 Action方法的異步 Action方法既可以同步也可以異步。異步Action方法的名字一般不需要以Async結尾。Web API中Action方法的返回值如果是普通數據類型,那么返回值…