MVCC詳細介紹及面試題

目錄

1.什么是mvcc?

2.問題引入

3. MVCC實現原理?

3.1 隱藏字段

3.2?undo log 日志

3.2.1?undo log版本鏈

3.3?readview

3.3.1?當前讀

?編輯

3.3.2?快照讀

3.3.3 ReadView中4個核心字段

3.3.4 版本數據鏈訪問的規則(了解)

4.面試題



前言:mysql中的Redolog日志保證了事務的持久性,Undolog保證了事務的原子性和一致性(回滾)

那事務的隔離性是怎么保證的呢?

答:

1. 鎖:排他鎖(如一個事務獲取了一個數據行的排他鎖,其他事務就不能再獲取該行的其他鎖)

2. mvcc:多版本并發控制

這里主要講一下mvcc

1.什么是mvcc?

多版本并發控制。指維護一個數據的多個版本,使得讀寫操作沒有沖突

2.問題引入

下面是一行數據,事務2、3、4都并發的對這行數據進行修改,而事務5要查詢兩次這行的最新數據,問查詢到的是哪一次事務執行到的結果?

如果你看到這里不知道結果,請你繼續往下看

3. MVCC實現原理?

MVCC的具體實現,主要依賴于數據庫記錄中的隱式字段undo log日志readView。? ? ??

3.1 隱藏字段

3.2?undo log 日志

回滾日志,在insert、update、delete的時候產生的便于數據回滾的日志。

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

而update、delete的時候,產生的undo log日志不僅在回滾時需要,mvcc版本訪問也需要,不會立即被刪除。

3.2.1?undo log版本鏈

不同事務或相同事務對同一條記錄進行修改,會導致該記錄的undolog生成一條記錄版本鏈表,鏈表的頭部是最新的舊記錄,鏈表尾部是最早的舊記錄。

下面是事務

3.3?readview

ReadView(讀視圖)是快照讀。是一個事務在執行 快照讀(SELECT 等語句) 時生成的,它保存了4個關鍵字段(3.4.3 有介紹)

3.3.1?當前讀

讀取的是記錄的最新版本,讀取時還要保證其他并發事務不能修改當前記錄,會對讀取的記錄進行加鎖。對于我們日常的操作,

如:select ... lock in share mode(共享鎖),select ... for update、update、insert、delete(排他鎖)都是一種當前讀。

3.3.2?快照讀

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

讀已提交 RC (Read Committed:每次select,都生成一個快照讀。

可重復讀 RR (Repeatable Read)(MySQL 的默認隔離級別):開啟事務后第一個select語句才是快照讀的地方。

3.3.3 ReadView中4個核心字段

ReadView(讀取視圖) 是一個事務在執行 快照讀(SELECT 等語句) 時生成的,它保存了以下關鍵字段:

還以下面的例子來解釋:

事務五第一次查詢id為30的記錄,此時:

m_ids:當前活躍的事務ID集合是事務三、四、五。因為在事務五第一次查詢之前事務二已經提交了(事務執行完畢)。

min_trx_id:最小活躍事務ID是事務三的id為3

max_trx_id:預分配事務ID,當前最大事務ID+1(因為事務ID是自增的),為事務5的id+1是6?

creator_trx_id:ReadView創建者的事務ID ,即為是事務五的id 5

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

讀已提交 RC READ COMMITTED :在事務中每一次執行快照讀時生成ReadView。

可重復讀 RRREPEATABLE READ:僅在事務中第一次執行快照讀時生成ReadView,后續復用該ReadView。

3.3.4 版本數據鏈訪問的規則(了解)

①. trx_id ?== creator_trx_id ? 可以訪問該版本

②. trx_id < min_trx_id ? 可以訪問該版本

③. trx_id > max_trx_id ? ?不可以訪問該版本

④. min_trx_id <= trx_id <= max_trx_id ? ?如果trx_id不在m_ids中是可以訪問該版本的

還以下面5個事務來舉例子:

還以事務五第一次查詢舉例分析可以得到以下結論

上述 ①~④ 是 InnoDB 在使用 MVCC 機制進行快照讀(Snapshot Read)時判斷一個版本是否可見的規則,目的是為了實現事務隔離性(尤其是可重復讀)

核心依據是將數據行上的 trx_id 與當前事務的 ReadView(讀取視圖)中的一些字段做比較,判斷是否可以“看到”這個版本。

詳細解釋:
①.當前事務的id(未知),等于事務創建者的id(這里是事務五),所以當前事務是事務五,說明當前數據是由“我自己”這個事務修改的。MVCC 當然允許自己看到自己改過的數據(包括未提交的),以確保 讀到的是自己操作后的最新快照

②.當前事務的id(未知),小于最小活躍事務ID(這里是事務三),所以當前事務是事務二,而事務二已經提交,

  • 說明這個事務在我生成 ReadView 之前就已經提交了。

  • 因此是 對我“可見”的歷史版本數據

③.當前事務的id(未知),大于最大活躍事務ID+1(這里是事務五),所以當前事務是事務六,事務六在此時ReadView 生成時,事務六還沒有創建

  • 所以它對我來說是“未來”的數據。

  • 根據事務隔離的原則,我不能看見這個數據版本。

④. min_trx_id <= trx_id <= max_trx_id,這個事務是在我生成 ReadView 時是活躍的(ID 在 min~max 之間),但它不在活躍事務列表 m_ids,說明它已經 提交完成了,因此我可以看見它。和②.表達的意思一樣

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

讀已提交 RC READ COMMITTED :在事務中每一次執行快照讀時生成ReadView。

可重復讀 RRREPEATABLE READ:僅在事務中第一次執行快照讀時生成ReadView,后續復用該ReadView。

舉例:

4.面試題

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

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

相關文章

企業級Active Directory架構設計與運維管理白皮書

企業級Active Directory架構設計與運維管理白皮書 第一章 多域架構設計與信任管理 1.1 企業域架構拓撲設計 1.1.1 林架構設計規范 林根域規劃原則&#xff1a; 采用三段式域名結構&#xff08;如corp.enterprise.com&#xff09;&#xff0c;避免使用不相關的頂級域名架構主…

android11 DevicePolicyManager淺析

目錄 &#x1f4d8; 簡單定義 &#x1f4d8;應用啟用設備管理者 &#x1f4c2; 文件位置 &#x1f9e0; DevicePolicyManager 功能分類舉例 &#x1f6e1;? 1. 安全策略控制 &#x1f4f7; 2. 控制硬件功能 &#x1f9f0; 3. 應用管理 &#x1f512; 4. 用戶管理 &am…

Java學習手冊:Java線程安全與同步機制

在Java并發編程中&#xff0c;線程安全和同步機制是確保程序正確性和數據一致性的關鍵。當多個線程同時訪問共享資源時&#xff0c;如果不加以控制&#xff0c;可能會導致數據不一致、競態條件等問題。本文將深入探討Java中的線程安全問題以及解決這些問題的同步機制。 線程安…

PyTorch核心函數詳解:gather與where的實戰指南

PyTorch中的torch.gather和torch.where是處理張量數據的關鍵工具&#xff0c;前者實現基于索引的靈活數據提取&#xff0c;后者完成條件篩選與動態生成。本文通過典型應用場景和代碼演示&#xff0c;深入解析兩者的工作原理及使用技巧&#xff0c;幫助開發者提升數據處理的靈活…

聲學測溫度原理解釋

已知聲速&#xff0c;就可以得到溫度。 不同溫度下的勝訴不同。 25度的聲速大約346m/s 絕對溫度-273度 不同溫度下的聲速。 FPGA 通過測距雷達測溫度&#xff0c;固定測量距離&#xff0c;或者可以測出當前距離。已知距離&#xff0c;然后雷達發出聲波到接收到回波的時間&a…

【網絡篇】UDP協議的封裝分用全過程

大家好呀 我是浪前 今天講解的是網絡篇的第二章&#xff1a;UDP協議的封裝分用 我們的協議最開始是OSI七層網絡協議 這個OSI 七層網絡協議 是計算機的大佬寫的&#xff0c;但是這個協議一共有七層&#xff0c;太多了太麻煩了&#xff0c;于是我們就把這個七層網絡協議就簡化為…

spring-ai-alibaba使用Agent實現智能機票助手

示例目標是使用 Spring AI Alibaba 框架開發一個智能機票助手&#xff0c;它可以幫助消費者完成機票預定、問題解答、機票改簽、取消等動作&#xff0c;具體要求為&#xff1a; 基于 AI 大模型與用戶對話&#xff0c;理解用戶自然語言表達的需求支持多輪連續對話&#xff0c;能…

嵌入式C語言高級編程:OOP封裝、TDD測試與防御性編程實踐

一、面向對象編程(OOP) 盡管 C 語言并非面向對象編程語言&#xff0c;但借助一些編程技巧&#xff0c;也能實現面向對象編程&#xff08;OOP&#xff09;的核心特性&#xff0c;如封裝、繼承和多態。 1.1 封裝 封裝是把數據和操作數據的函數捆綁在一起&#xff0c;對外部隱藏…

藍橋杯 web 常考到的一些知識點

filter&#xff1a;filter方法創建一個新數組&#xff0c;其包含通過所提供函數實現的測試的所有元素。這個 方法不會改變原數組&#xff0c;而是返回一個新的數組。 map&#xff1a;map方法創建一個新數組&#xff0c;其結果是該數組中的每個元素都調用一個提供的函數后的 返回…

音視頻小白系統入門筆記-0

本系列筆記為博主學習李超老師課程的課堂筆記&#xff0c;僅供參閱 音視頻小白系統入門課 音視頻基礎ffmpeg原理 緒論 ffmpeg推流 ffplay/vlc拉流 使用rtmp協議 ffmpeg -i <source_path> -f flv rtmp://<rtmp_server_path> 為什么會推流失敗&#xff1f; 默認…

mysql按條件三表并聯查詢

下面為你呈現一個 MySQL 按條件三表并聯查詢的示例。假定有三個表&#xff1a;students、courses 和 enrollments&#xff0c;它們的結構和關聯如下&#xff1a; students 表&#xff1a;包含學生的基本信息&#xff0c;有 student_id 和 student_name 等字段。courses 表&…

UML之序列圖的消息

序列圖表現各參與者之間為完成某個行為而發生的交互及其時間順序&#xff0c;序列圖中的交互通過消息實現。消息是從一條生命線到另一條生命線的通信&#xff0c;它們通常是水平或傾斜向下的箭頭&#xff0c;從發送方生命線離開&#xff0c;到達接收方生命線。如果需要&#xf…

UniAD:自動駕駛的統一架構 - 創新與挑戰并存

引言 自動駕駛技術正經歷一場架構革命。傳統上&#xff0c;自動駕駛系統采用模塊化設計&#xff0c;將感知、預測和規劃分離為獨立組件。而上海人工智能實驗室的OpenDriveLab團隊提出的UniAD&#xff08;Unified Autonomous Driving&#xff09;則嘗試將這些任務整合到一個統一…

如何寫好合同管理系統需求分析

引言 在當今企業數字化轉型的浪潮中&#xff0c;合同管理系統作為企業法律合規和商業運營的重要支撐工具&#xff0c;其需求分析的準確性和完整性直接關系到系統建設的成敗。本文基于Volere需求過程方法論&#xff0c;結合江鈴汽車集團合同管理系統需求規格說明書實踐案例&…

libevent服務器附帶qt界面開發(附帶源碼)

本章是入門章節&#xff0c;講解如何實現一個附帶界面的服務器&#xff0c;后續會完善與優化 使用qt編譯libevent源碼演示視頻qt的一些知識 1.主要功能有登錄界面 2.基于libevent實現的服務器的業務功能 使用qt編譯libevent 下載這個&#xff0c;其他版本也可以 主要是github上…

八、自動化函數

1.元素的定位 web自動化測試的操作核心是能夠找到頁面對應的元素&#xff0c;然后才能對元素進行具體的操作。 常見的元素定位方式非常多&#xff0c;如id,classname,tagname,xpath,cssSelector 常用的主要由cssSelector和xpath 1.1 cssSelector選擇器 選擇器的功能&#x…

Web三漏洞學習(其二:sql注入)

靶場&#xff1a;NSSCTF 、云曦歷年考核題 二、sql注入 NSSCTF 【SWPUCTF 2021 新生賽】easy_sql 這題雖然之前做過&#xff0c;但為了學習sql&#xff0c;整理一下就再寫一次 打開以后是杰哥的界面 注意到html網頁標題的名稱是 “參數是wllm” 那就傳參數值試一試 首先判…

單片機非耦合業務邏輯框架

在小型單片機項目開發初期&#xff0c;由于業務邏輯相對簡單&#xff0c;我們往往較少關注程序架構層面的設計。 然而隨著項目經驗的積累&#xff0c;開發者會逐漸意識到模塊間的耦合問題&#xff1a;當功能迭代時&#xff0c;一處修改可能引發連鎖反應。 此時&#xff0c;構…

Zookeeper三臺服務器三節點集群部署(docker-compose方式)

1. 準備工作 - 服務器:3 臺服務器,IP 地址分別為 `10.10.10.11`、`10.10.10.12`、`10.10.10.13`。 - 安裝 Docker:確保每臺服務器已安裝 Docker 和 Docker Compose。 - 網絡通信:確保三臺服務器之間可以通過 IP 地址互相訪問,并開放以下端口: - `2181`:Zookeeper 客戶…

Mac關閉sip方法

Mac關閉sip方法 導航 文章目錄 Mac關閉sip方法導航完整操作流程圖詳細步驟 完整操作流程圖 這東西是我在網上搬運下來的&#xff0c;但是我在為業務實操過程中&#xff0c;根據實操情況還是有新的注意點的 詳細步驟 1.在「關于本機」-「系統報告」-「軟件」;查看SIP是否開啟…