MySQL——MVCC(多版本并發控制)

目錄

1.MVCC多版本并發控制的一些基本概念

MVCC實現原理

記錄中的隱藏字段

undo log

undo log 版本鏈

ReadView

數據訪問規則

具體實現邏輯

總結


1.MVCC多版本并發控制的一些基本概念

當前讀:該取的是記錄的最新版本,讀取時還要保證其他并發事務不能修改當前記錄,會對該取的記錄進行加鎖。對于我們日常的操作,如:select...lock in share mode(共享鎖), select...for update,update,insert. delete(排他鎖)都是一種當前讀。

快照讀:簡單的select(不加鎖)就是快照讀,快照讀讀取的是記錄數據的可見版本,有可能是歷史數據,不加鎖,是非阻塞讀。正常select語句就是一個快照讀,

  • read committed:每次select,都生成一個快照讀。
  • repeatable read:開啟事務后第一個select語句才是快照讀的地方。
  • serializable:快照讀會退化為當前讀。

MVCC:全稱multi-versioncurency contol,多版本井發控制,指推護一個數據的多個版本,使得讀寫提作沒有沖突,快照讀為MySQL實現。MVCC提供了一個非阻塞讀功能。MVCC的具體實現,還需要依賴于數據庫記錄中的三個隱式字段,undolog日志,readview。

MVCC實現原理

記錄中的隱藏字段

DB_TRX_ID:最近修改事務id,記錄插入這條記錄或者最后一次修改記錄的事務id

DB_ROLL_PTR:回滾指針,指向這條記錄的上一個版本,用于配合undo log,指向上一個版本

DB_ROW_ID:隱藏主鍵,如果表結構沒有指定主鍵,將會生成該隱藏字段。

undo log

回滾日志,在insert,update,delete的時候產生的便于數據回滾的日志。記錄數據回滾之前是什么樣的

insert:產生的undo log日志在回滾時需要,在事務提交后,可被立即刪除。

undate,delete:產生undo log日志不僅在回滾時需要,在快照讀時也需要,不會被立即刪除

undo log 版本鏈

1.首先事務2去執行sql語句之前InnoDB引擎會在undo log日志里記錄數據回滾前是什么樣

再去修改數據,DB_TRX_ID會修改為當前事務id,DB_ROLL_PTR會指向回滾日志

2.事務3去修改數據首先會在undo log 日志記錄當前數據,再去修改數據DB_TRX_ID修改為3,DB_ROLL_PTR指向當前日志記錄,當前日志記錄指向前一次記錄形成一個版本鏈

所以undo log版本鏈指的是:不用事務或者相同事務對同一條記錄進行修改,導致該記錄的undolog生成一條記錄版本鏈表,鏈表頭部是最最新的舊紀錄,鏈表尾部是最早的舊紀錄。

那我們應該選擇哪一個版本呢在事務回滾的時候?

ReadView

ReadView(讀視圖)是快照讀SQL執行時MVCC提取數據的依據,記錄并維護系統當前活躍的事務(未提交的)id

ReadView包含了四個核心字段:

不同的隔離級別,生成ReadView的時機不同:

read committed:在事務中每一次執行快照讀時生成readview.
repeatableread:僅在事務中第一次執行快照讀時生成readview,后續復用該readview.

數據訪問規則

  • 1.trx_id(當前事務id)==cteator_trx_id(創建快照版本的事務id)?可以訪問該版本->? 成立,說明數據時當前這個事務更改的
  • 2.trx_id<mix_trx_id(最小活動事務id,最先開啟事務還沒有提交事務id)?可以訪問該版本->? 成立,說明數據已經提交了
  • 3.trx_id > max_trx_id?不可以訪問該版本->? 成立,說明該事務是在readview生成后才開啟。
  • 4.min_trx_id <= trx_id <= max_trx_id?如果trx_id不在m_ids中是可以訪問該版本的->? 說
  • 明數據已經提交

具體實現邏輯

1.m_ids:{3,4,5}由圖可知,事務2commited了還有3,4,5沒有提交

2.min_trx_id:3 事務3是還沒有提交事務的最早開啟事務的

3.max_trx_id:6 預先分配事務,下一個事務為6

4.creator_trx_id:5創建readview的為事務5

在RC(read commited)隔離級別下查找快照讀版本邏輯

1.當前記錄DB_TRX_ID = 4根據數據訪問規則去匹配,發現這四條規則一體條都匹配不上,選擇去undo log版本鏈找第二條記錄

2.第二條記錄當前操作事務id=3,也就是DB_TRX_ID = 3根據數據訪問規則去匹配發現這四條規則也一樣一條匹配不上,選擇去undo log 版本鏈找第三條記錄操作事務id = 2

3.第三條記錄當前操作事務id = 2,根據數據數據訪問規則去匹配,發現 trx_id < min _ trx_id匹配上了說明這次快照讀找的版本是這條記錄id = 2,直接把這個版本記錄直接返回

在RR(repeatatable)事務隔離級別下,僅在事務中第一次執行快照讀時生成ReadView,后續復用該ReadView

在第二次快照讀的時候不會生成快照讀,復用上面readview,可重復讀

兩個readview都一樣,匹配規則肯定一樣,查找出來的數據也是一模一樣,這就保證了可重復讀

總結

MVCC作用主要我們在快照讀的時候來決定我們提取的到底是哪個版本

MVCC實際上實現原理是3部分,隱藏字段,Undo log ,Read View

隱藏字段:主要取決于事務id,和回滾指針

undo log 版本鏈

Read View讀視圖

MVCC? + 鎖保證了事務當中的隔離性,一致性:指的是數據執行前和執行之后是一致的,如果事務執行失敗全部回滾保證數據執行前后一致,一致性由 redo log 和undo log 保證的

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

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

相關文章

【Linux篇】深入理解文件系統:從基礎概念到 ext2 文件系統的應用與解析

文件系統的魔法&#xff1a;讓計算機理解并存儲你的數據 一. 文件系統1.1 塊1.2 分區1.3 inode(索引節點) 二. ext2文件系統2.1 認識文件系統2.2 Block Group (塊組)2.2.1 Block Group 的基本概念2.2.2 Block Group 的作用 2.3 塊組內部結構2.3.1 超級塊&#xff08;Super Bloc…

3 VS Code 配置優化與實用插件推薦:settings.json 詳解、CodeGeeX 智能編程助手及插件離線安裝方法

1 優化 settings.json 文件 1.1 settings.json 簡介 settings.json 是 VS Code 的核心配置文件&#xff0c;用于存儲用戶的個性化設置和偏好。通過該文件&#xff0c;用戶可以自定義和覆蓋 VS Code 的默認行為&#xff0c;包括但不限于以下方面&#xff1a; 編輯器外觀&#…

【Java面試系列】Spring Cloud微服務架構中的分布式事務處理與Seata框架實現原理詳解 - 3-5年Java開發必備知識

【Java面試系列】Spring Cloud微服務架構中的分布式事務處理與Seata框架實現原理詳解 - 3-5年Java開發必備知識 1. 引言 在微服務架構中&#xff0c;分布式事務處理是一個復雜且常見的問題。隨著業務規模的擴大&#xff0c;單體應用逐漸拆分為多個微服務&#xff0c;每個服務…

力扣面試150題--有效的數獨

Day 19 題目描述 思路 其實還挺簡單的&#xff0c;主要的難點在于如何判斷每個小數獨是否滿足要求 詳細見代碼 class Solution {public boolean isValidSudoku(char[][] board) {HashSet<Character> set new HashSet<>();//處理行HashSet<Character> set1…

達夢數據庫-學習-15-大內存SQL相關視圖介紹

目錄 一、環境信息 二、介紹 三、數據字典表 1、V$MEM_POOL 2、V$SQL_STAT 3、V$SQL_STAT_HISTORY 4、V$LARGE_MEM_SQLS 5、V$SYSTEM_LARGE_MEM_SQLS 四、總結 一、環境信息 名稱值CPU12th Gen Intel(R) Core(TM) i7-12700H操作系統CentOS Linux release 7.9.2009 (Co…

從0到1使用C++操作MSXML

1. 引言 MSXML&#xff08;Microsoft XML Core Services&#xff09;是微軟提供的一套用于處理XML的COM組件庫&#xff0c;廣泛應用于Windows平臺的XML解析、驗證、轉換等操作。本文將詳細介紹如何從零開始&#xff0c;在C中使用MSXML解析和操作XML文件&#xff0c;包含完整的…

Windows 系統下用 VMware 安裝 CentOS 7 虛擬機超詳細教程(包含VMware和鏡像安裝包)

前言 資源 一、準備工作 &#xff08;一&#xff09;下載 VMware Workstation &#xff08;二&#xff09;下載 CentOS 7 鏡像 二、安裝 VMware Workstation&#xff08;比較簡單&#xff0c;按下面走即可&#xff09; 三、創建 CentOS 7 虛擬機 四、安裝 CentOS 7 系統…

應用安全系列之四十五:日志偽造(Log_Forging)之三

1、簡介 針對Java的日志系統有多種&#xff0c;本文主要描述如何通過修改配置文件來解決logback和log4j的日志偽造問題。 2、logback 2.1、系統提供的解決方案 在logback.xml中配置編碼器自動轉義特殊字符&#xff1a; 復制 <configuration><appender name"C…

(五)循環鏈表、雙向鏈表

循環鏈表 介紹 在單選鏈表基礎上&#xff0c;下一個節點指向前一個節點&#xff0c;最后一個節點指向起點 封裝循環鏈表 為了讓循環鏈表可以繼承自單向鏈表&#xff0c;對其進行重構 給其增加一個tail屬性&#xff08;尾節點&#xff09;&#xff0c;對各方法進行重寫整理 …

仙劍奇俠傳98柔情版游戲秘籍

戰斗秘技&#xff1a;在戰斗中輸入 “cheat”&#xff0c;然后輸入 “v” 直接取勝&#xff1b;輸入 “y” 敵人不攻擊。另外&#xff0c;在戰斗中按 “XJPXZ123” 加 “shift” 鍵&#xff0c;攻擊力增加 1000&#xff05;。等級提升秘籍&#xff1a;當李逍遙等級到達 99 級時…

常見的歸一化(Normalization)方法

本文詳解深度學習中常見的歸一化方法。 【歸一化是將數據按比例縮放&#xff0c;使之落入一個特定的區間】目錄 1. 批量歸一化&#xff08;Batch Normalization&#xff0c;BN&#xff09;1.1 數學原理1.2 代碼示例 2. 層歸一化&#xff08;Layer Normalization&#xff0c;LN&…

行星際激波在日球層中的傳播:Propagation of Interplanetary Shocks in the Heliosphere (參考文獻部分)

行星際激波在日球層中的傳播&#xff1a;Propagation of Interplanetary Shocks in the Heliosphere &#xff08;第一部分&#xff09;-CSDN博客 行星際激波在日球層中的傳播&#xff1a;Propagation of Interplanetary Shocks in the Heliosphere &#xff08;第二部分&…

大模型可視化應用敏捷開發方案:Dify+Echarts

大模型相關目錄 大模型&#xff0c;包括部署微調prompt/Agent應用開發、知識庫增強、數據庫增強、知識圖譜增強、自然語言處理、多模態等大模型應用開發內容 從0起步&#xff0c;揚帆起航。 Moe模式&#xff1a;或將是最好的大模型應用開發路徑一文帶你了解大模型RAG詳細記錄…

23種GoF設計模式

GoF&#xff08;Gang of Four&#xff09;設計模式是由四位計算機科學家 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著的書籍《Design Patterns: Elements of Reusable Object-Oriented Software》中提出的設計模式 目錄 一、創建型模式&#xff08;Cre…

Losson 4 NFS(network file system(網絡文件系統))

網絡文件系統&#xff1a;在互聯網中共享服務器中文件資源。 使用nfs服務需要安裝:nfs-utils 以及 rpcbind nfs-utils : 提供nfs服務的程序 rpcbind &#xff1a;管理nfs所有進程端口號的程序 nfs的部署 1.客戶端和服務端都安裝nfs-utils和rpcbind #安裝nfs的軟件rpcbind和…

C++ 入門六:多態 —— 同一接口的多種實現之道

在面向對象編程中&#xff0c;多態是最具魅力的特性之一。它允許我們通過統一的接口處理不同類型的對象&#xff0c;實現 “一個接口&#xff0c;多種實現”。本章將從基礎概念到實戰案例&#xff0c;逐步解析多態的核心原理與應用場景&#xff0c;幫助新手掌握這一關鍵技術。 …

關于C使用Windows API獲取系統管理員權限和對文本屬性的操作,以及windows API的核心操作

關于windows系統的操作程序開發&#xff0c;本文介紹一部分重要的文本屬性操作&#xff0c;和運行計次器。 獲取系統管理員權限 #include <windows.h> VOID ManagerRun(LPCSTR exe, LPCSTR param, INT nShow) { //注意&#xff1a;會跳出提示。SHELLEXECUTEINFO ShExec…

Web 項目實戰:構建屬于自己的博客系統

目錄 項目效果演示 代碼 Gitee 地址 1. 準備工作 1.1 建表 1.2 引入 MyBatis-plus 依賴 1.3 配置數據庫連接 1.4 項目架構 2. 實體類準備 - pojo 包 2.1 dataobject 包 2.2 request 包 2.3 response 包 2.3.1 統一響應結果類 - Result 2.3.2 用戶登錄響應類 2.3.3…

從“被動跳閘”到“主動預警”:智慧用電系統守護老舊小區安全

安科瑞顧強 近年來&#xff0c;老舊小區電氣火災事故頻發&#xff0c;成為威脅居民生命財產安全的重要隱患。據統計&#xff0c;我國居住場所火災傷亡人數遠超其他場所&#xff0c;僅今年一季度就發生8.3萬起住宅火災&#xff0c;造成503人遇難。這些建筑多建于上世紀&#x…

【深入淺出 Git】:從入門到精通

這篇文章介紹下版本控制器。 【深入淺出 Git】&#xff1a;從入門到精通 Git是什么Git的安裝Git的基本操作建立本地倉庫配置本地倉庫認識工作區、暫存區、版本庫的概念添加文件添加文件到暫存區提交文件到版本庫提交文件演示 理解.git目錄中的文件HEAD指針與暫存區objects對象 …