Mysql-MVCC機制

1. MVCC機制詳解

在Read Uncommitted級別下,事務總是讀取到最新的數據,因此根本用不到歷史版本,所以MVCC不在該級別下工作。

在Serializable級別下,事務總是順序執行。寫會加寫鎖,讀會加讀鎖,完全用不到MVCC,所以MVCC也不在該級別下工作。

Mysql在讀已提交和可重復讀隔離級別下都實現了MVCC機制。

Mysql在可重復讀隔離級別下如何保證事務較高的隔離性,同樣的sql查詢語句在一個事務里多次執行查詢結果相同,就算其它事務對數據有修改也不會影響當前事務sql語句的查詢結果。這個隔離性就是靠MVCC(Multi-Version Concurrency Control)機制來保證的,對一行數據的讀和寫兩個操作默認是不會通過加鎖互斥來保證隔離性,避免了頻繁加鎖互斥,而在串行化隔離級別為了保證較高的隔離性是通過將所有操作加鎖互斥來實現的。

2. undo日志版本鏈

undo日志版本鏈是指一行數據被多個事務依次修改過后,在每個事務修改完后,Mysql會保留修改前的數據undo回滾日志,并且用兩個隱藏字段trx_id和roll_pointer把這些undo日志串聯起來形成一個歷史記錄版本鏈。

InnoDB存儲引擎在數據庫每行數據的后面添加了三個字段

  • 6字節的事務ID(DB_TRX_ID)字段:當一個事務開始執前,mysql會為這個事務分配一個全局自增的事務id。之后該事務對當前行進行的增、刪、改操作時,都會將自己的事務id記錄到DB_TRX_ID中。

  • 7字節的回滾指針(DB_ROLL_PTR)字段:事務對當前行進行改動時,會將舊數據寫入進undo log中,再將新數據寫入當前行,且當前行的roll_pointer指向剛才那個undo log,因此可以通過roll_pointer找到該行的前一個版本。

  • 6字節的DB_ROW_ID字段:如果當前表有整數類型的主鍵,則row_id就是主鍵的值。如果沒有整數類型的主鍵,則mysql會按照字段順序選擇一個非空的整數類型的唯一索引作為row_id。如果mysql沒有找到,則會自動生成一個自動增長的整數作為row_id。

當一直有事務對該行改動時,就會一直生成undo log,最終將會形成undo log版本鏈

3. Read View機制詳解

在可重復讀隔離級別,當事務開啟,執行任何查詢sql時會生成當前事務的一致性視圖read-view,該視圖在事務結束之前都不會變化(如果是讀已提交隔離級別在每次執行查詢sql時都會重新生成),這個視圖由執行查詢時所有未提交事務m_ids數組(數組里最小的id為m_up_limit_id)和已創建的最大事務id(m_low_limit_id)組成,事務里的任何sql查詢結果需要從對應版本鏈里的最新數據開始逐條跟read-view做比對從而得到最終的快照結果。

在RC級別下,當前事務總是希望讀取到別的事務已經提交的數據,因此當前事務事務會在執行每一次快照讀的情況下都會去生成ReadView,實時更新m_ids,及時發現那些已經提交的事務。

在RR級別下,當前事務當然也能夠讀取到別的事務已經提交的數據,但為了避免不可重復讀,因此只會在執行第一次快照讀的情況下去生成ReadView,之后的快照讀會一直沿用該ReadView。

字段含義
m_ids在創建ReadView的那一刻,mysql中所有未提交的事務id集合
m_up_limit_idm_ids中的最小值,如果當前無活躍事務,為m_low_limit_id值
m_low_limit_idmysql即將為下一個事務分配的事務id,并不是m_ids中的最大值
m_creator_trx_id即創建此ReadView的事務id

4. undo日志版本鏈比對規則

在這里插入圖片描述

1.當【版本鏈中記錄的 trx_id 等于當前事務id(trx_id = creator_trx_id)】時,說明版本鏈中的這個版本是當前事務修改的,所以該快照記錄對當前事務可見。

2.如果 row 的 trx_id 落在綠色部分( trx_id < m_up_limit_id),表示這個版本是已提交的事務生成的,這個數據是可見的;

3.如果 row 的 trx_id 落在紅色部分( trx_id > m_low_limit_id),表示這個版本是由將來啟動的事務生成的,是不可見的(若row 的 trx_id 就是當前自己的事務是可見的);

4.如果 row 的 trx_id 落在黃色部分(m_up_limit_id<= trx_id < m_low_limit_id),那就包括兩種情況

  • 若 row 的 trx_id 在視圖數組中,表示這個版本是由還沒提交的事務生成的,不可見(若 row 的 trx_id 就是當前自
    己的事務是可見的);
  • 若 row 的 trx_id 不在視圖數組中,表示這個版本是已經提交了的事務生成的,可見。
    對于刪除的情況可以認為是update的特殊情況,會將版本鏈上最新的數據復制一份,然后將trx_id修改成刪除操作的
    trx_id,同時在該條記錄的頭信息(record header)里的(deleted_flag)標記位寫上true,來表示當前記錄已經被
    刪除,在查詢時按照上面的規則查到對應的記錄如果delete_flag標記位為true,意味著記錄已被刪除,則不返回數
    據。
    注意:begin/start transaction 命令并不是一個事務的起點,在執行到它們之后的第一個修改操作InnoDB表的語句,
    事務才真正啟動,才會向mysql申請事務id,mysql內部是嚴格按照事務的啟動順序來分配事務id的。

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

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

相關文章

MySQL面試題及詳細答案 155道(061-080)

《前后端面試題》專欄集合了前后端各個知識模塊的面試題&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

大數據中需要知道的監控頁面端口號都有哪些

以下是一些大數據中常見組件監控頁面的端口號&#xff1a;1. Hadoop&#xff1a;HDFS Web UI在Hadoop2.x版本中默認端口為50070&#xff0c;在Hadoop3.x版本中為9870&#xff0c;用于查看集群文件及目錄&#xff1b;YARN Web UI端口為8088&#xff0c;可查看MR執行情況&…

時隔六年!OpenAI 首發 GPT-OSS 120B / 20B 開源模型:性能、安全與授權細節全解

為什么這次開放值得關注&#xff1f; OpenAI 時隔六年再次“放權重”&#xff0c;一次性公布 gpt-oss-120b 與 gpt-oss-20b 兩個尺寸&#xff0c;并允許商業化二次開發 —— 采用 Apache 2.0 許可且可直接在 Hugging Face 下載(WIRED)。官方表示&#xff0c;開放旨在 降低門檻…

漏洞全講解之中間件與框架漏洞(數字基礎設施的“阿喀琉斯之踵“)

一、中間件漏洞的嚴峻現狀根據Synopsys《2023年開源安全報告》顯示&#xff1a;企業應用中平均包含158個中間件依賴高危漏洞年增長率達62%&#xff08;X-Force數據&#xff09;最危險漏洞&#xff1a;Log4j2&#xff08;CVE-2021-44228&#xff09;影響全球83%企業平均修復延遲…

Leetcode——菜鳥筆記2(移動0)

文章目錄題目解題題目 解題 /*nums【0&#xff0c;1&#xff0c;0&#xff0c;3&#xff0c;2】numsSize5 nums【1.3.2.0.0】 1.找非零數&#xff0c;依次放在前面 2.剩下補0 */ void moveZeroes(int* nums, int numsSize) {int count0 0;int temp 0;for (int i 0; i < …

【LINUX網絡】應用層自定義協議與序列化——通過實現一個簡單的網絡計算器來體會自定義協議

在了解了各種協議的使用以及簡單的socket接口后&#xff0c;學會了“怎么傳”的問題&#xff0c;現在來了解一下“傳什么”的問題。 1. 序列化與反序列化 在前面的TCP、UDP的socket api 的接口, 在讀寫數據時, 都是按 "字符串" 的方式來發送接收的. 如果我們要傳輸一…

電腦一鍵重裝系統win7/win10/win11無需U盤(無任何捆綁軟件圖文教程)

建議還是使用U盤進行重裝系統&#xff0c;如果暫時還不會沒有U盤&#xff0c;那就按照我這個來吧。 一&#xff0c;工具下載&#xff1a; 一鍵重裝工具 密碼:g5p3 二&#xff0c;鏡像下載: 鏡像站點&#xff1a;MSDN, 我告訴你 - 做一個安靜的工具站 可以下載需要重裝的系統…

深入探索Supervision庫:Python中的AI視覺助手

深入探索Supervision庫&#xff1a;Python中的AI視覺助手 在計算機視覺和機器學習領域&#xff0c;數據處理和結果可視化是項目成功的關鍵環節。今天我們將深入探討一個強大的Python庫——Supervision&#xff0c;它專為簡化AI視覺項目的工作流程而設計。 什么是Supervision&am…

面向對象之類、繼承和多態

系統是由匯總了數據和過程的“對象”組成的。在面向對象中&#xff0c;軟件被定義為“類”&#xff0c;然后創建“實例”并運行。系統是通過“實例”之間的互相交換“消息”而運行的&#xff0c;但由于進行了“封裝”&#xff0c;所以無法查看內部的詳細內容&#xff0c;這被稱…

傳統防火墻與下一代防火墻

防火墻的發展過程第一種簡單包過濾防火墻工作于&#xff1a;3、4層實現了對于IP、UDP、TCP信息的一些檢查優點&#xff1a;速度快、性能高、可用硬件實現&#xff1b;兼容性較好檢查IP、UDP、TCP信息缺點&#xff1a;安全性有限&#xff1a;僅能基于數據包的表面層面進行審查&a…

計算機視覺前言-----OpenCV庫介紹與計算機視覺入門準備

前言&#xff1a;OpenCV庫介紹與計算機視覺入門 OpenCV概述 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一個開源的計算機視覺和機器學習軟件庫&#xff0c;由Intel于1999年首次發布&#xff0c;現由非盈利組織OpenCV.org維護。它包含了超過2500種…

AI面試系統助手深度評測:6大主流工具對比分析

導語&#xff1a;秋招季&#xff0c;企業如何破局高效招聘&#xff1f;隨著2024年秋招季臨近&#xff0c;企業招聘壓力陡增。據牛客調研數據顯示&#xff0c;74.2%的求職者已接觸過AI面試&#xff0c;89.2%的企業認為AI顯著提升了篩選效率。然而&#xff0c;面對市場上琳瑯滿目…

浮雕軟件Artcam安裝包百度云網盤下載與安裝指南

如你所知&#xff0c;ArtCAM是一款專業的CAD/CAM軟件工具&#xff0c;主要用于三維浮雕設計、珠寶加工及CNC數控雕刻&#xff0c;可將二維構思快速轉化為三維藝術產品&#xff0c;深受使用者的喜愛。一、主要應用領域?工藝品與制造業?&#xff1a;木工雕花、標牌制作、模具制…

六邊形架構模式深度解析

在分布式系統設計領域&#xff0c;六邊形架構&#xff08;Hexagonal Architecture&#xff0c;又稱端口與適配器模式&#xff09;作為一種以領域為中心的架構模式&#xff0c;通過明確分離核心業務邏輯與外部交互&#xff0c;有效提升系統的可測試性、可擴展性與可維護性。本文…

Beelzebub靶機

一、主機發現 arp-scan掃描一下局域網靶機 二、信息收集 nmap -sV -A -T4 -p- 192.168.31.132 22端口ssh服務和80端口web服務是打開的 目錄掃描 三、滲透測試 訪問一下web服務是個apache的首頁 web頁面分析 有一個很奇怪的地方&#xff0c;index.php明明是一個200的響應&a…

目前常用于視頻會議的視頻編碼上行/下行帶寬對比

視頻編碼上行/下行帶寬對比H.264、VP8和VP9在不同終端數量下的上行與下行帶寬需求差異&#xff08;單位&#xff1a;Mbps&#xff09;編碼效率說明H.264基準編碼標準&#xff0c;上行和下行帶寬需求相對較高&#xff0c;硬件兼容性最佳VP8開源編碼&#xff0c;上行和下行帶寬均…

CrewAI ——構建多智能體協作的框架

CrewAI 是一個用于構建多智能體協作的框架&#xff0c;它的核心目標是通過協調多個智能體&#xff08;Agents&#xff09;來完成復雜任務。這些智能體不僅可以在單一任務中進行合作&#xff0c;還可以在動態、開放的環境中進行交互與協作。CrewAI 的設計和實現使得智能體之間能…

【數據結構初階】--排序(五)--計數排序,排序算法復雜度對比和穩定性分析

&#x1f525;個人主頁&#xff1a;草莓熊Lotso &#x1f3ac;作者簡介&#xff1a;C研發方向學習者 &#x1f4d6;個人專欄&#xff1a; 《C語言》 《數據結構與算法》《C語言刷題集》《Leetcode刷題指南》 ??人生格言&#xff1a;生活是默默的堅持&#xff0c;毅力是永久的…

InfluxDB 數據備份與恢復高級策略(二)

案例實戰&#xff1a;InfluxDB 數據備份恢復業務場景描述假設我們正在參與一個大型的物聯網項目&#xff0c;該項目涉及分布在不同區域的數千個傳感器設備 &#xff0c;這些設備實時采集環境溫度、濕度、設備運行狀態等數據&#xff0c;并將這些數據存儲在 InfluxDB 數據庫中。…

sqli-labs通關筆記-第36關GET寬字符注入(單引號閉合 手工注入+腳本注入 3種方法)

目錄 一、轉義函數 1、mysqli_real_escape_string 2、addslashes 3、轉義區別 二、寬字符注入 三、sqlmap之tamper 四、sqlmap之unmagicquotes 五、源碼分析 1、代碼審計 2、SQL注入安全性分析 六、滲透實戰 1、進入靶場 2、id1探測 3、id-1探測 4、id1%df and…