MySQL鎖機制與MVCC原理剖析

在MySQL中,我們使用到了它的各種類鎖;按照它的維度,有各種鎖

  • 從數據庫的操作粒度有,表鎖,行鎖。
  • 從數據庫的操作的類型,有讀鎖和寫鎖。
  • 性能上有樂觀鎖和悲觀鎖。

在上一篇文章中的事務隔離級別,需要解決的是不可重復讀和幻讀問題,所以在遍歷掃描聚集索引記錄時,為了防止掃描過的索引被其他事務修改,從而導致數據不一致。這里引用了間隙鎖
間隙鎖(Gap Lock)
鎖的是這兩個值直接的間隙,間隙鎖的在可重復讀隔離級別下才會生效。

MVCC(Multi-Version Concurrency Control)
隔離性就是靠MVCC機制來保證的,對一行數據的讀和寫兩個操作默認是不會通過加鎖互斥來保證隔離性,避免了頻繁加鎖互斥。
MySQL在可重復讀和讀已提交的隔離級別實現了MVCC機制。

undo日志版本鏈與read view機制
undo日志版本是指一行數據被多個事務依次修改后,每個事務修改完成后,MySQL會保留修改前的數據undo回滾日志,并用2個隱藏日志trx_id和roll_pointer把這些undo日志串聯起來形成一個歷史版本記錄鏈。

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

版本鏈對比規則:
1.如果row的trx_id落在最小min_id部分(trx_id < min_id),表示這個版本是已提交的事務生成的,這個數據是可見的。
2.如果row的trx_id落在最大部分(trx_id > max_id),表示這個版本是將來期待的事務生成的,是不可見的。
3.如果row的trx_id落在了之間(min_id <= trx_id <= max_id),那么就有2種情況
a.若trx_id在視圖數組中,標識這個版本是由還沒提交的事務生成的,不可見。
b.若trx_id不在視圖數組中,表示這個版本是已經提交了的事務生成的,可見。

事務隔離級別為 讀已提交的,每次執行sql都會重新生成read-view,故不會出現上述問題。
在這里插入圖片描述
RR級別中,select1的事務中,查詢的結果為500,雖然事務100進行了更新數據,再次進行select1的事務時,由于屬于上述版本中的版本鏈對比,commite結果也不可見,故而第二次查詢的結果依舊為500.
而select 2開始查詢的時候,由于已經commite,故而查詢結果為1000.
如果是RC隔離級別的話,每次的read view會進行變化,兩次查詢會為 500和1000
在這里插入圖片描述
在這里插入圖片描述

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

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

相關文章

C++學習(線程相關)

目錄 一、線程庫thread 1.使用外部函數 2. 使用類的函數 3. 添加參數 二、線程庫 mutex 1.使用lock()方法 2.try_lock()方法 三、線程庫lock_guard 四、線程庫unique_lock 1.adopt_lock 2.defer_lock() 五、線程庫call_once 六、線程庫promise & future 七、c…

EPOLLONESHOT 深度解析:Linux epoll 的單次觸發機制

EPOLLONESHOT 深度解析&#xff1a;Linux epoll 的單次觸發機制 EPOLLONESHOT 是 Linux epoll 接口中的高級事件標志&#xff0c;用于實現精確的事件單次觸發控制。以下是其全面技術解析&#xff1a; 核心設計理念 #mermaid-svg-Xg5sCLdddqmKsvKG {font-family:"trebuchet…

深入解析MongoDB分片原理與運維實踐指南

深入解析MongoDB分片原理與運維實踐指南 技術背景與應用場景 隨著互聯網業務的高速發展&#xff0c;單節點MongoDB實例在數據量和訪問并發上都面臨瓶頸。為了解決數據存儲容量受限和讀寫性能下降的問題&#xff0c;MongoDB官方提供了分片&#xff08;Sharding&#xff09;方案&…

基于Django的天氣數據可視化分析預測系統

【86-Django】基于Django的天氣數據可視化分析預測系統&#xff08;完整系統源碼開發筆記詳細部署教程&#xff09;? 目錄 一、項目簡介 二、項目界面展示 三、項目視頻展示 四、技術架構 五、核心功能模塊 六、部署教程一、項目簡介 隨著全球氣候變化和極端天氣事件的頻發&am…

怎么放大單片機輸出電流

單片機作為電子系統的控制核心&#xff0c;其 I/O 口輸出電流通常較小&#xff08;一般在 10-20mA 左右&#xff09;&#xff0c;難以直接驅動繼電器、電機、大功率 LED 等需要較大工作電流的外設。因此&#xff0c;在實際應用中需通過特定電路放大單片機輸出電流&#xff0c;實…

站長百科類網站pbootcms模板(自適應手機端)+利于SEO優化(下載)

站長百科類網站pbootcms模板(自適應手機端)利于SEO優化 模板介紹&#xff1a; PbootCMS內核開發的模板&#xff0c;該模板屬于新聞資訊、新聞博客類企業使用&#xff01; 頁面簡潔簡單&#xff0c;容易管理&#xff0c;附帶測試數據&#xff01; 模板特點&#xff1a; 1、手工書…

【Golang】Go語言函數

Go語言函數 文章目錄Go語言函數Go函數特點一、函數的基本格式定義二、匿名函數三、自執行函數四、閉包函數五、延遲調用Go函數特點 無需聲明原型支持不定 變參支持多返回值支持匿名函數和閉包函數也是一種類型&#xff0c;一個函數可以賦值給變量不支持嵌套&#xff0c;一個包…

JAVA算法練習題day2

雙指針4.移動零二刷昨天的題&#xff0c;學習了新的數據結構StringBuilder。專為頻繁字符串拼接設計的可變字符串類。(https://blog.csdn.net/m0_73941339/article/details/145651287)二刷完昨天的題目&#xff0c;做到這題腦子已經轉不動了。做雙指針&#xff0c;一般雙指針初…

LLM2Rec-新國立-KDD2025-微調LLM獲得蘊含協同信息的embedding

文章目錄1. 背景與問題任務背景動機LLM2Rec 兩大步驟2. 方法2.1 Collaborative Supervised Fine-tuning&#xff08;CSFT&#xff09;2.2 Item-level Embedding Modeling2.2.1 從單向注意力 → 雙向注意力&#xff08;Bidirectional attention&#xff09;2.2.2 商品級別的對比…

前端學習9:JavaScript--對象與原型

前言&#xff1a;適合有基礎的同學入門嘗試 / 復習回憶。對象基礎&#xff1a;1.創建用戶對象const user {// 屬性&#xff08;鍵值對&#xff09;name: "小島",age: 20,isAdmin: false, }2.方法&#xff08;函數屬性&#xff09;sayHello() {console.log(你好&…

網絡:應用層

網絡&#xff1a;應用層 我們要知道&#xff0c;所有的問題解決都是在應用層。:happy: 協議是一種約定&#xff0c;也就是雙方約定好的結構化的數據。但是在讀寫數據時我們都是按字符串的方式來發送接受的&#xff0c;那么我們應該如和傳輸結構化的數據呢&#xff1f;應用層協…

rust-包和箱子

&#x1f4e6; 圖解 Rust 代碼組織層級 #mermaid-svg-fBDy1PDZZ6bi000z {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-fBDy1PDZZ6bi000z .error-icon{fill:#552222;}#mermaid-svg-fBDy1PDZZ6bi000z .error-text{fi…

C++算法競賽篇(五)循環嵌套題型講解

C算法競賽篇&#xff08;五&#xff09;循環嵌套題型講解前言C循環嵌套題型講解第一題 包含數字的9第二題 求出 e 的值第三題 斐波那契數列第四題 第 n 小的質數第五題 水仙花數前言 前面的題型里我們認識了C里面的三大循環本篇博客我們開始講解C循環嵌套題型 我的個人主頁&am…

Gradio全解8——ChatInterfaceChatbot:聊天界面類與聊天機器人(3)——ChatInterface的多模態功能與附加輸入輸出

Gradio全解8——ChatInterface&Chatbot&#xff1a;聊天界面類與聊天機器人&#xff08;3&#xff09;——ChatInterface的多模態功能與附加輸入輸出8.3 ChatInterface的多模態功能與附加輸入輸出8.3.1 多模態功能1. 設置multimodal和fn參數2. 傳入MultimodalTextbox組件及…

php算法-- 關聯數組使用,優化sip賬號去重

文章目錄1 變量定義2. 核心特性code1 變量定義 類型&#xff1a;嵌套的關聯數組&#xff08;Nested Associative Array&#xff09;外層結構&#xff1a;[中繼ID > 賬號列表]鍵 (Key)&#xff1a;中繼ID&#xff08;字符串或整型&#xff09;值 (Value)&#xff1a;索引數組…

LLM 多語言數據集

多語言數據感覺主要還是fineweb和fineweb2, 其他數據都是主要針對特定語種比較多 101 Billion Arabic Words Dataset ClusterlabAi/101_billion_arabic_words_dataset 數據主要從e Common Crawl WET 中提取&#xff0c;并采用了創新的技術來進行去重和篩選&#xff0c;主要解決…

【HarmonyOS Next之旅】DevEco Studio使用指南(三十六) -> 配置構建(三)

目錄 1 -> 定制HAR多目標構建產物 1.1 -> 定義產物的deviceType 1.2 -> 定義C工程依賴的.so文件 1.3 -> 定義產物的資源 2 -> 配置APP多目標構建產物 2.1 -> 定義產物的APP包名和供應商名稱 2.2 -> 定義product的bundleName 2.3 -> 定義produc…

數據賦能(340)——技術平臺——共享平臺

概述重要性如下&#xff1a;提高數據利用效率&#xff1a;數據共享平臺能夠將分散在各部門的數據進行集中管理&#xff0c;促進數據流通和共享&#xff0c;避免數據孤島現象&#xff0c;從而提高數據利用效率。促進決策科學化&#xff1a;通過共享平臺&#xff0c;各部門可以獲…

開閉原則在C++中的實現

開閉原則&#xff08;Open/Closed Principle&#xff0c;簡稱 OCP&#xff09;是面向對象設計中的一個重要原則&#xff0c;屬于“SOLID”原則之一。它的核心思想是&#xff1a;“軟件實體&#xff08;如類、模塊、函數等&#xff09;應該對擴展開放&#xff0c;對修改關閉。”…

C語言:*p++與p++有何區別

1. 指針基礎練習&#xff1a;演示p、p和(*p)的區別核心目的&#xff1a;區分指針自增與指針指向值自增的不同邏輯&#xff0c;理解運算符優先級對指針操作的影響。#include <stdio.h>void arr1() {int arr[] {11,13,15,17,19};int *p arr;printf("結果1&#xff1…