MVCC併發版本控制之重點ReadView

来源:https://www.cnblogs.com/hanlinyuan/archive/2023/06/19/17491913.html
-Advertisement-
Play Games

MVCC併發版本控制 本文大部分來自《MySQL是怎樣運行的》,這裡只是簡單總結,用於各位回憶和複習。 版本鏈 對於使用 InnoDB 存儲引擎的表來說,它的聚簇索引記錄中都包含兩個必要的隱藏列(不知道的快去看《MySQL是怎樣運行的》) trx_id :每次一個事務對某條聚簇索引記錄進行改動時,都 ...


MVCC併發版本控制

本文大部分來自《MySQL是怎樣運行的》,這裡只是簡單總結,用於各位回憶和複習。

版本鏈

對於使用 InnoDB 存儲引擎的表來說,它的聚簇索引記錄中都包含兩個必要的隱藏列(不知道的快去看《MySQL是怎樣運行的》)

  • trx_id :每次一個事務對某條聚簇索引記錄進行改動時,都會把該事務的 事務id 賦值給 trx_id 隱藏列。

  • roll_pointer :每次對某條聚簇索引記錄進行改動時,都會把舊的版本寫入到 undo日誌中,然後這個隱藏列就相當於一個指針,可以通過它來找到該記錄修改前的信息。

    假設現在有兩個事務id 分別為 100 、 200 的事務對這條記錄進行 UPDATE 操作,操作流程如下:

    image-20230619133617294

每次對記錄進行改動,都會記錄一條undo日誌(不懂的可以理解為一個記錄著過去的操作的日誌) ,每條 undo日誌 也都有一個 roll_pointer 屬性( INSERT 操作對應的 undo日誌 沒有該屬性,因為該記錄並沒有更早的版本),可以將這些 undo日誌 都連起來,串成一個鏈表,所以現在的情況就像下圖一樣:

image-20230619132714830

對該記錄每次更新後,都會將舊值放到一條 undo日誌 中,就算是該記錄的一個舊版本,隨著更新次數的增多, 所有的版本都會被 roll_pointer 屬性連接成一個鏈表,我們把這個鏈表稱之為 版本鏈 ,版本鏈的頭節點就是當 前記錄最新的值。另外,每個版本中還包含生成該版本時對應的 事務id ,這個信息很重要,我們稍後就會用到。

ReadView

我們來引出一下readview是什麼東西:

對於使用 READ UNCOMMITTED 隔離級別的事務來說,由於可以讀到未提交事務修改過的記錄,所以直接讀取記錄的最新版本就好了

對於使用 SERIALIZABLE 隔離級別的事務來說,則是使用加鎖的方式來問記錄

但是!!!對於使用 READ COMMITTED 和 REPEATABLE READ 隔離級別的事務來說

必須保證讀到已經提交了的事務修改過的記錄,也就是說假如另一個事務已經修改了記錄但是尚未提交, 是不能直接讀取最新版本的記錄的,核心問題就是:需要判斷一下版本鏈中的哪個版本是當前事務可見的。為此,設計 InnoDB 的大叔提出了一個 ReadView 的概念,這個 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,mi n_trx_id的值就是1,max_trx_id的值就是4。

  • creator_trx_id :表示生成該 ReadView 的事務的事務id 。

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

有了 ReadView ,這樣在訪問某條記錄時,只需要按照下邊4個步驟判斷記錄的某個版本是否可見:註意,與被訪問版本對比的東西都是指(當前最新的ReadView)

  • 如果(被訪問版本的) trx_id = creator_trx_id ,意味著當前事務在訪問它自己修改過的記錄,所以該版本可以被當前事務訪問。

  • 如果(被訪問版本的) trx_id < min_trx_id ,表明生成該版本的事務在當前事務生成 ReadView 前已經提交,所以該版本可以被當前事務訪問。

  • 如果(被訪問版本的) trx_id > max_trx_id ,表明生成該版本的事務在當前事務生 成 ReadView 後才開啟,所以該版本不可以被當前事務訪問。

  • 如果(被訪問版本的)min_trx_id < trx_id < max_trx_id ,那就需要判斷一下 trx_id 屬性值是不是在 m_ids 活躍事務列表中。

    • 如果在,說明創建 ReadView 時生成該版本的事務還是活躍的,還沒提交,該版本不可以被訪問。

    • 如果不在,說明創建 ReadView 時生成該版本的事務已經被提交,該版本可以被訪問。

ReadView生成時機

讀已提交 和 可重覆讀 隔離級別最大的區別就是它們生成ReadView的時機不同:

  • READ COMMITTED —— 每次讀取數據前都生成一個ReadView

    • 每次select操作都生成一個ReadView,所以每一次查詢都在用一個最新生成的ReadView進行上述4步走,所以查出來的應該是最新提交的事務中的最後一個操作(因為一個事務可能有多個增改操作)

  • REPEATABLE READ —— 在第一次讀取數據時生成一個ReadView

    • 意味著你在第一次執行select語句之後,不管增刪改了多少次,永遠拿第一次select生成的ReadView來進行剛剛說的4個步驟判斷,所以一直查詢的是第一次select語句所查出來的東西。

具體例子這裡不過多贅述,還是自行看書。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • `WPF`的依賴屬性是一項強大的功能,它允許我們創建可擴展、靈活和可重用的`UI`組件。通過依賴屬性,我們可以實現屬性的數據綁定、樣式化、動畫化以及屬性值的有效驗證和轉換。在本文中,我們介紹了幾個關鍵概念和用法,包括初始依賴屬性、自定義依賴屬性、只讀依賴屬性以及附加屬性。 ...
  • >原本只是想要每次打開終端,預設是 zsh ,方便使用 oh-my-zsh。但誰能料到這個配置有個史前大坑! ## 問題復現 頂部菜單欄的`終端` > 首選項配置:`未命名` > `命令` > 運行自定義命令 > 命令退出時:退出終端。 **只要這條命令出錯,或者執行完畢,就會結束退出了** (太痛 ...
  • ## 使用(微軟賬戶)進行遠程桌面連接 1. 打開找到[查看高級系統設置] -> [遠程] -> [遠程桌面]。 ![image](https://img2023.cnblogs.com/blog/3081210/202306/3081210-20230620213008346-1294112930 ...
  • logstash在需要收集日誌的伺服器里運行,將日誌數據發送給es 在kibana頁面查看es的數據 es和kibana安裝: Install Elasticsearch with RPM | Elasticsearch Guide [8.8] | Elastic Configuring Elast ...
  • ##[Ooonly新人貼]記錄工作中遇到的問題,話不多說先上乾貨 問題:類似K線與藍牙接收部門模塊,要求由原來的接收串口中斷改為DMA接收。據說要用到空閑中斷與DMA中斷,但是經模擬發現DMA每完成傳輸一個數據(比如1BYTE)就會進入空閑中斷(k線發現這種情況),考慮到這樣進入中斷的頻率和以前串口 ...
  • 更改緩衝區(Change Buffer)是一種特殊的數據結構,用於緩存不在緩衝池中的二級索引(secondary index)頁的更改。可能來自於 INSERT、UPDATE 或 DELETE 操作(數據操作語言,DML)的緩衝更改,會在後續通過其他讀操作將這些頁載入到緩衝池時被合併。 ...
  • 摘要:華為宣佈實現了自主創新的MetaERP研發,並且完成了對舊ERP系統的全面替換,這其中,就採用了華為雲GaussDB資料庫特有的全密態技術,對ERP系統中的絕密數據進行加密保護,從而保障了數據的安全。 ERP系統在幫助企業優化業務流程、實現數字化管理方面有重要作用,可以說企業所有的業務流轉都需 ...
  • 摘要:HyG圖計算引擎採用CSR格式來存儲圖的拓撲信息,CSR格式可以將稀疏矩陣的存儲空間壓縮,進而大大降低圖的存儲開銷,同時具備訪問效率高、格式易轉化等優點。 本文分享自華為雲社區《CSR格式如何更新? GES圖計算引擎HyG揭秘之數據更新》,作者: π 。 HyG圖計算引擎採用CSR格式來存儲圖 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...