深入解析 MySQL 并發控制:讀寫鎖、鎖粒度與高級優化

深入解析 MySQL 并發控制:讀寫鎖、鎖粒度與 InnoDB 實現細節

在高并發數據庫應用中,確保數據一致性的同時最大化性能是永恒的挑戰。MySQL 通過精巧的 鎖機制(Locking)多版本并發控制(MVCC) 來解決這個問題。本文聚焦于鎖機制的核心:讀寫鎖(共享/排他鎖)鎖粒度(表鎖/行鎖),并深入探討 InnoDB 存儲引擎的具體實現和高級優化。


一、讀寫鎖(Read-Write Locks)深入剖析

讀寫鎖的核心思想是區分 讀取(Read)寫入(Write) 操作,因為它們對數據一致性的要求不同。

  1. 共享鎖(Shared Lock, S Lock)

    • 目的: 允許多個事務 同時讀取 同一份數據(通常是一個記錄或頁面)。
    • 行為:
      • 獲取:事務執行 SELECT ... LOCK IN SHARE MODE 語句時申請 S 鎖。
      • 兼容性:多個事務可以同時持有同一資源的 S 鎖。這是 共享 的核心體現。
      • 沖突:S 鎖與 X 鎖互斥。如果一個事務持有 S 鎖,其他事務無法獲得該資源的 X 鎖;反之亦然(但持有 S 鎖的事務可以再獲得 S 鎖)。普通 SELECT (SELECT ...) 通常不需要 S 鎖(利用 MVCC)。
    • 典型場景:REPEATABLE READSERIALIZABLE 隔離級別下,需要確保兩次讀取之間數據不被修改,但又允許其他事務讀取時使用。
  2. 排他鎖(Exclusive Lock, X Lock)

    • 目的: 保證同一時間 僅有一個事務 能夠 修改 特定數據。
    • 行為:
      • 獲取:事務執行數據修改語句(INSERT, UPDATE, DELETE)或 SELECT ... FOR UPDATE 時申請 X 鎖。
      • 兼容性:X 鎖與所有其他鎖(包括 S 鎖和其他 X 鎖)互斥。事務獲得資源的 X 鎖后,其他事務的任何鎖請求(S 或 X)都將被阻塞,直到該 X 鎖釋放。事務自己持有的 X 鎖之間可能兼容也可能沖突(如鎖定同一行則沖突)。
      • 強制性:在修改數據時,X 鎖是必須獲得的,無法回避。
    • 典型場景: 所有需要修改數據的操作以及在高隔離級別下需要“鎖定讀取”確保不被其他事務修改的場景。
  3. 鎖兼容性矩陣(核心關系)

    當前持有鎖 \ 請求新鎖共享鎖 (S)排他鎖 (X)
    共享鎖 (S)? (兼容)? (沖突)
    排他鎖 (X)? (沖突)? (沖突)

    解讀:

    • 一行: 表示一個事務當前持有了什么鎖(S 或 X)。
    • 一列: 表示這個事務或者另一個事務想請求什么新鎖(S 或 X)。
    • 單元格(?/?): 表示在持有鎖的狀態下,請求新鎖是否被允許(是否兼容)。
    • 關鍵點: X 鎖的存在會阻止任何其他鎖(S 或 X)的獲取;S 鎖只阻止 X 鎖的獲取,但允許多個 S 鎖共存。

二、鎖粒度(Lock Granularity)深度解析

鎖的粒度決定了鎖定時資源的最小單位,直接影響并發度和開銷。

  1. 表級鎖(Table-Level Locks)

    • 鎖定對象: 整個數據庫表。
    • 實現引擎: MyISAM, MEMORY, MERGE 等非事務引擎的默認鎖策略。
    • 鎖類型:
      • 表共享讀鎖 (Table Read Lock - 類似 IS):
        • 允許:其他會話可以同時獲取表讀鎖(執行 SELECT 但非 LOCK IN SHARE MODE/FOR UPDATE 時,MyISAM 引擎會隱式加讀鎖)。允許并發
        • 禁止:其他會話無法獲得表寫鎖。所有操作被阻塞。
      • 表獨占寫鎖 (Table Write Lock - 類似 IX):
        • 允許:只有持有鎖的會話可以讀寫該表。
        • 禁止:其他會話對該表的所有讀寫操作(無論是隱式讀鎖還是顯式寫鎖請求)都會被阻塞。
    • 優點:
      • 實現簡單。
      • 開銷極低(內存占用少,獲取/釋放速度快)。
    • 缺點:
      • 并發度最低: 寫操作會阻塞所有其他操作;讀操作也會阻塞所有寫操作。在高并發讀寫混合場景下性能極差。
      • 易成瓶頸: 一個耗時寫操作會“鎖死”整個表。
    • 使用場景: 主要用于只讀表、讀遠大于寫的低并發場景,或非常小的表。強烈不建議在高并發 OLTP 環境中使用表級鎖引擎。
  2. 行級鎖(Row-Level Locks)

    • 鎖定對象: 單個數據行(實際上是鎖住索引記錄)。
    • 實現引擎: InnoDB(默認且推薦)。NDB 集群也支持。
    • 鎖類型(InnoDB 主要鎖模式):
      • 記錄鎖 (Record Lock):
        • 鎖定索引中單一行記錄(即使沒有顯式索引,InnoDB 也會隱式創建聚簇索引)。
        • 防止其他事務修改(加 X Lock)或 SELECT ... FOR UPDATE/LOCK IN SHARE MODE(加 S/X Lock)被鎖定的具體行。
      • 間隙鎖 (Gap Lock):
        • 鎖定索引記錄之間的間隙(Gap),或者第一個索引記錄之前或最后一個索引記錄之后的“無限”間隙。
        • 目的: 防止其他事務將新記錄插入到該間隙中(避免“幻讀”)。
        • 特性:
          • 只鎖定間隙,不鎖定已有記錄本身。允許其他事務修改間隙兩端的記錄。
          • 只與其他試圖在同一個間隙插入記錄的意向鎖沖突。
          • 僅在 REPEATABLE READ (默認) 和 SERIALIZABLE 隔離級別下生效。 READ COMMITTED 級別會禁用間隙鎖(通過半一致讀避免部分幻讀)。
      • 臨鍵鎖 (Next-Key Lock):
        • 記錄鎖 + 間隙鎖的組合。鎖定索引記錄以及該記錄之前的間隙
        • 例如,索引有值 10, 11, 13。Next-Key Lock 可能鎖定:
          • (negative infinity, 10]
          • (10, 11]
          • (11, 13]
          • (13, positive infinity]
        • 這是 InnoDB 在 REPEATABLE READ 級別下默認的行鎖算法。它能同時避免“臟讀”、“不可重復讀”和一部分“幻讀”
      • 插入意向鎖 (Insert Intention Lock):
        • 一種特殊的間隙鎖 (Gap Lock)
        • 在執行 INSERT 操作之前設置。
        • 意圖: 表示一個事務想在一個索引間隙中插入一個新行。
        • 特性:
          • 不相互阻塞: 多個事務可以在同一個間隙的不同位置插入意向鎖(只要插入位置不同),允許并發插入。
          • 沖突: 會與已經持有的該間隙上的 間隙鎖 (Gap Lock)臨鍵鎖 (Next-Key Lock) 沖突。這是插入操作阻塞的主要根源之一。
    • 優點:
      • 高并發度: 不同的事務可以同時修改表的不同行(只要它們不鎖定同一行)。
    • 缺點:
      • 高開銷: 獲取、維護和釋放鎖需要大量系統資源(內存、CPU)。鎖管理器需要為大量行維護鎖信息。
      • 管理復雜: 檢測和解決死鎖更復雜。
      • 潛在死鎖: 多個事務按不同順序請求行鎖極易導致死鎖。
    • 使用場景: 高并發 OLTP(在線事務處理)系統的絕對首選。
  3. 頁面鎖 (Page-Level Locks - 已逐漸淡出主流)

    • 鎖定數據頁(通常 16KB)。
    • 早期存儲引擎(如 BDB)使用。
    • 介于表鎖和行鎖之間。
    • 現今重要性較低。

鎖粒度選擇建議:

  • 追求最高并發寫 (OLTP): 絕對選擇支持行級鎖的引擎,尤其是 InnoDB。這是現代 MySQL 應用的標配。
  • 極端讀密集型、極少更新 (如數據倉庫報表讀取、靜態配置表): 若性能關鍵且能接受表鎖缺點,可考慮 MyISAM(但需注意崩潰恢復、備份等問題),但 InnoDB 通常是更安全、更全面的選擇
  • 避免使用 LOCK TABLES 語句:它會強制加表鎖,破壞 InnoDB 的行鎖機制,引發嚴重性能問題和死鎖。

三、InnoDB 鎖機制深入實現細節
  1. 意向鎖 (Intention Locks):行級鎖與表級鎖的橋梁

    • 目的: 快速判斷表級鎖與行級鎖的兼容性,避免逐行檢查。
    • 類型:
      • 意向共享鎖 (Intention Shared Lock, IS): 事務打算在中的某些行上設置

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

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

相關文章

【深度學習加速探秘】Winograd 卷積算法:讓計算效率 “飛” 起來

一、為什么需要 Winograd 卷積算法?從 “卷積計算瓶頸” 說起 在深度學習領域,卷積神經網絡(CNN)被廣泛應用于圖像識別、目標檢測、語義分割等任務。然而,卷積操作作為 CNN 的核心計算單元,其計算量巨大&a…

前端項目脫離后端運行,備份后端API數據

問題描述: 開發過的項目老是打不開,因為離開公司后服務器用不了了。所以想著在公司開發的時候把數據都備份一下,供之后參考項目代碼。 實現方法: 建一個Express服務,前端請求Express,Express代理目標服務器…

Windows下利用DevEcoStudio的交叉編譯工具鏈編譯assimp庫給OpenHarmony使用

文章目錄 準備編譯使用 準備 安裝DevEco Studio,并且安裝好對應OpenHarmony版本的SDK 比如我這里安裝了API 11 的sdk 對應的文件夾 然后下載ASSIMP的源文件,我這里下載的是5.4.3版本 【assimp 5.4.3】 解壓放在一個文件夾里面,并在源碼文…

批量大數據并發處理中的內存安全與高效調度設計(以Qt為例)

背景 在批量處理大型文件(如高分辨率圖片、視頻片段、科學數據塊)時,開發者通常希望利用多核CPU并行計算以提升處理效率。然而,如果每個任務對象的數據量很大,直接批量并發處理極易導致系統內存被迅速耗盡,出現程序假死、崩潰,甚至系統級“死機”。 Qt自帶的線程池(Q…

微信小程序課程設計美食點餐訂餐系統

文章目錄 1. 項目概述2. 項目思維導圖3. 系統架構特點4. 核心模塊實現代碼1. 登錄注冊2. 首頁模塊實現4. 分類模塊實現5. 購物車模塊實現6. 訂單模塊實現 5. 注意事項6. 項目效果截圖7. 關于作者其它項目視頻教程介紹 1. 項目概述 在移動互聯網時代,餐飲行業數字化…

Linux中使用grep查看日志

Linux中使用grep查看日志 文章目錄 Linux中使用grep查看日志1、使用 grep 查找字符或字符串示例常用選項例子 2、顯示前后上下文選項說明示例命令 結果示例 3、顯示出現的次數使用示例選項說明示例其他方法總結 4、其他命令1. 基本用法2. 常用選項3. 正則表達式支持4. 其他實用…

DataWhale-零基礎絡網爬蟲技術(二er數據的解析與提取)

課程鏈接先給各位 ↓↓↓ (點擊即可食用.QAQ Datawhale-學用 AI,從此開始 一、數據的解析與提取 數據提取的幾種方式: re解析bs4解析xpath解析 1.1正則表達式(Reuglar Experssion) RE是一種用于字符串匹配的規則描述方式。它…

Gin框架與Apifox

第一部分:技術棧概述 1. Go語言簡介 Go(又稱Golang)是Google開發的一門靜態類型、編譯型編程語言,具有以下特點: 高性能:編譯為機器碼,執行效率接近C/C 簡潔語法:沒有復雜的OOP概…

Docker 容器技術入門與環境部署

一、Docker 技術概述與核心概念解析 (一)Docker 技術本質與定位 Docker 是當前主流的操作系統級容器虛擬化技術,其核心價值在于通過輕量化隔離機制解決開發、測試與生產環境的一致性問題。與傳統虛擬機(如 VMware)相…

π0源碼(openpi)剖析——從π0模型架構的實現:如何基于PaLI-Gemma和擴散策略去噪生成動作,到基于C/S架構下的模型訓練與部署

前言 ChatGPT出來后的兩年多,也是我瘋狂寫博的兩年多(年初deepseek更引爆了下),比如從創業起步時的15年到后來22年之間 每年2-6篇的,干到了23年30篇、24年65篇、25年前兩月18篇,成了我在大模型和具身的原始技術積累 如今一轉眼已…

Vui:輕量級語音對話模型整合包,讓交互更自然

Vui:輕量級語音對話模型,讓交互更自然 🗣?? Vui 是 Fluxions-AI 團隊推出的一款開源輕量級語音對話模型,其核心架構基于 LLaMA。這款模型經過了長達 4 萬小時的真實對話數據訓練,能夠逼真地模擬人類對話中的語氣詞、…

【STL】深入理解 string 的底層思想

一、STL的定義 STL是C標準庫的一部分它不僅是一個可復用的組件庫還是一個包含數據結構和算法的軟件框架。 二、STL的歷史和版本 原始版本: Alexander Stepanov、Meng Lee在惠普實驗室完成的原始版本,本著開源精神,他們聲明允許任何人任意運…

深入剖析Linux epoll模型:從LT/ET模式到EPOLLONESHOT的實戰指南

一、epoll:高性能I/O復用的核心引擎 epoll是Linux內核2.6引入的高效I/O多路復用機制,專為解決C10K問題而生。相比select/poll,epoll在連接數激增時性能優勢顯著: // 創建epoll實例 int epollfd epoll_create1(0);// 事件注冊 s…

網絡安全之某cms的漏洞分析

漏洞描述 該漏洞源于Appcenter.php存在限制,但攻擊者仍然可以通過繞過這些限制并以某種方式編寫代碼,使得經過身份驗證的攻擊者可以利用該漏洞執行任意命令 漏洞分析 繞過編輯模板限制,從而實現RCE 這里可以修改模板文件,但是不…

Nginx-前端跨域解決方案!

1 Nginx 核心 Nginx 是一個開源的高性能 HTTP 和反向代理服務器,以輕量級、高并發處理能力和低資源消耗著稱。除作為 Web 服務器外,還可充當郵件代理服務器和通用的 TCP/UDP 代理服務器,廣泛應用于現代 Web 架構中。 在 Windows 系統中使用…

RedisVL 入門構建高效的 AI 向量搜索應用

一、前置條件 在開始之前,請確保: 已在 Python 環境中安裝 redisvl。運行 Redis Stack 或 Redis Cloud 實例。 二、定義索引架構(IndexSchema) 索引架構(IndexSchema)用于定義 Redis 的索引配置和字段信…

基于ssm移動學習平臺微信小程序源碼數據庫文檔

摘 要 由于APP軟件在開發以及運營上面所需成本較高,而用戶手機需要安裝各種APP軟件,因此占用用戶過多的手機存儲空間,導致用戶手機運行緩慢,體驗度比較差,進而導致用戶會卸載非必要的APP,倒逼管理者必須改…

【Python】Tkinter模塊(巨詳細)

專欄文章索引:Python 有問題可私聊:QQ:3375119339 本文內容系本人根據閱讀的《Python GUI設計tkinter從入門到實踐》所得,以自己的方式進行總結和表達。未經授權,禁止在任何平臺上以任何形式復制或發布原始書籍的內容。如有侵權,請聯系我刪除。 目錄 一、Tkinter與GUI …

【C++特殊工具與技術】局部類

在 C 的類體系中,除了全局類、嵌套類(在類內部定義的類),還有一種特殊的存在 ——局部類(Local Class)。它像函數內部的 “封閉王國”,作用域嚴格限制在所屬函數內,既擁有類的封裝特…

《C#圖解教程 第5版》深度推薦

《C#圖解教程 第5版》深度推薦 在 C# 編程語言的浩瀚學習資源中,《C#圖解教程 第5版》宛如一座燈塔,為開發者照亮前行之路。通過其詳實的目錄,我們能清晰窺見這本書在知識架構、學習引導上的匠心獨運,無論是編程新手還是進階開發者…