MySQL:深入總結鎖機制

寫在前面

在 MySQL 數據庫中,鎖機制是保障并發控制和數據一致性的關鍵。合理運用鎖機制,能有效避免數據競爭,提升數據庫性能。接下來,我們就深入了解 MySQL 中的各類鎖。

博主總結(注:針對總結的詳解補充在后面)

  • 鎖機制
    • mysql里有哪些鎖?
      • 全局鎖:通過flush tables with read lock 語句會將整個數據庫就處于只讀狀態了,這時其他線程執行以下操作,增刪改或者表結構修改都會阻塞。全局鎖主要應用于做全庫邏輯備份,這樣在備份數據庫期間,不會因為數據或表結構的更新,而出現備份文件的數據與預期的不一樣。
      • 表級鎖

        • read、write實現讀寫鎖也就是共享鎖、排他鎖。
        • ①表鎖:通過lock tables 語句可以對表加表鎖,表鎖除了會限制別的線程的讀寫外,也會限制本線程接下來的讀寫操作。對于 InnoDB 引擎,無索引的 UPDATE/DELETE 可能會導致鎖升級為表鎖。
        • ②元數據鎖:當我們對數據庫表進行操作時,會自動給這個表加上 MDL鎖,對一張表進行 CRUD 操作時,加的是 MDL 讀鎖;對一張表做結構變更操作的時候,加的是 MDL 寫鎖;MDL 是為了保證當用戶對表執行 CRUD 操作時,防止其他線程對這個表結構做了變更。
        • ③意向鎖:意向鎖是一種表級鎖,表示事務打算對表中的某些行數據加鎖,但不會直接鎖定數據行本身。當執行 SELECT ... LOCK IN SHARE MODE 時,會自動加意向共享鎖;當執行 SELECT ... FOR UPDATE 時,會自動加意向排他鎖。意向鎖之間互相兼容,也不會與行鎖沖突。
          • 作用:意向鎖的目的是為了快速判斷表里是否有記錄被加鎖。在沒有意向鎖的情況下,當事務 A 持有某表的行鎖時,如果事務 B 想添加表鎖,InnoDB 必須檢查表中每一行數據是否被加鎖,這種全表掃描的方式效率極低。有了意向鎖之后,事務在加行鎖前,先在表上加對應的意向鎖;其他事務加表鎖時,只需檢查表上的意向鎖,無需逐行檢查。

      • 行級鎖:InnoDB 引擎是支持行級鎖的,而 MyISAM 引擎并不支持行級鎖。行鎖是 InnoDB 存儲引擎中最細粒度的鎖,它鎖定表中的一行記錄,允許其他事務訪問表中的其他行。底層是通過給索引加鎖實現的,這就意味著只有通過索引條件檢索數據時,InnoDB 才能使用行級鎖,否則會退化為表鎖。

        • 通過 SELECT ... FOR UPDATE 可以加排他鎖。通過 SELECT ...LOCK IN SHARE MODE 可以加共享鎖。
        • ①記錄鎖,鎖住的是一條記錄。而且記錄鎖是有 S 鎖和 X 鎖之分的,滿足讀寫互斥,寫寫互斥
        • ②間隙鎖,只存在于可重復讀隔離級別,目的是為了解決可重復讀隔離級別下幻讀的現象。
        • ③Next-Key Lock 稱為臨鍵鎖,是 Record Lock + Gap Lock 的組合,鎖定一個范圍,并且鎖定記錄本身。
    • MySQL的樂觀鎖和悲觀鎖了解嗎?
      • MySQL 中的行鎖和表鎖都是悲觀鎖。
      • 悲觀鎖是一種"先上鎖再操作"的保守策略,它假設數據被外界訪問時必然會產生沖突,因此在數據處理過程中全程加鎖,保證同一時間只有一個線程可以訪問數據。

      • 樂觀鎖會假設并發操作不會總發生沖突,屬于小概率事件,因此不會在讀取數據時加鎖,而是在提交更新時才檢查數據是否被其他事務修改過。樂觀鎖并不是 MySQL 內置的鎖機制,而是通過程序邏輯實現的,常見的實現方式有版本號機制和時間戳機制。通過在表中增加 version 字段或者 timestamp 字段來實現。

    • 遇到過MySQL死鎖問題嗎,你是如何解決的?
      • 遇到過。MySQL 的死鎖是由于多個事務持有資源并相互等待引起的。
      • 我通過 SHOW ENGINE INNODB STATUS 查看死鎖信息,定位到是加鎖順序不一致導致的,最后通過調整加鎖順序解決了這個問題。
    • MySQL兩個線程的update語句同時處理一條數據,會不會有阻塞?
      • 會,行級鎖鎖住了。
      • 具體例子來說,當事務A對id = 1這行記錄執行更新操作時,會在主鍵id為1的記錄上添加X類型(排他鎖)的記錄鎖。此時,如果事務B也嘗試對id = 1的記錄進行更新,由于發現該記錄已經被加鎖,事務B就會進入阻塞狀態,直到事務A提交或回滾,釋放鎖之后,事務B才能繼續執行。
    • 兩條update語句處理一張表的不同的主鍵范圍的記錄,一個<10,一個>15,會不會遇到阻塞?底層是為什么的?
      • 不會,臨鍵鎖沒有沖突。因為這兩個范圍沒有重疊部分,所以不存在鎖沖突。
      • 具體例子來說,假設存在兩條UPDATE語句,分別處理主鍵范圍不同的記錄:
        • 第一條UPDATE語句的條件是id < 10,它鎖定的范圍是(-∞, 10),即小于10的所有記錄及其間隙。
        • 第二條UPDATE語句的條件是id > 15,它鎖定的范圍是(15, +∞),即大于15的所有記錄及其間隙。
    • 如果2個范圍不是主鍵或索引?還會阻塞嗎?
      • 會,因為第一個查詢觸發了全表查詢,相當于加了表鎖。這時第二個查詢就會阻塞。
      • 具體解釋下,因為如果 update 沒有用到索引,在掃描過程中會對索引加鎖,所以全表掃描的場景下,所有記錄都會被加鎖,也就是這條 update 語句產生了 4 個記錄鎖和 5 個間隙鎖,相當于鎖住了全表。

———————————————————————————————————————————

———————————————————————————————————————————

實戰:解決 MySQL 死鎖問題

遇到死鎖時,可通過SHOW ENGINE INNODB STATUS查看詳細信息。曾遇到因加鎖順序不一致導致的死鎖,通過調整加鎖順序成功解決。

常見問題解答

  • 兩個線程update同一數據:會阻塞,因行級排他鎖鎖定該行記錄,需等前一事務提交或回滾釋放鎖。
  • 兩條update語句處理不同主鍵范圍記錄:若無重疊,臨鍵鎖無沖突,不會阻塞。
  • 操作范圍無索引:會觸發全表掃描,相當于添加表鎖,導致后續操作阻塞。

掌握 MySQL 鎖機制,有助于在開發和運維中合理使用鎖,提升數據庫性能與穩定性。后續可進一步探索不同業務場景下的鎖優化策略,歡迎大家在評論區分享經驗!

比如在項目中,兩個事務分別更新兩張表,但是更新順序不一致。

-- 創建表/插入數據
CREATE TABLE account (id INT AUTO_INCREMENT PRIMARY KEY,balance INT NOT NULL
);INSERT INTO account (balance) VALUES (100), (200);-- 事務 1
START TRANSACTION;
-- 鎖住 id=1 的行
UPDATE account SET balance = balance - 10 WHERE id = 1;-- 等待鎖住 id=2 的行(事務 2 已鎖住)
UPDATE account SET balance = balance + 10 WHERE id = 2;-- 事務 2
START TRANSACTION;
-- 鎖住 id=2 的行
UPDATE account SET balance = balance - 10 WHERE id = 2;-- 等待鎖住 id=1 的行(事務 1 已鎖住)
UPDATE account SET balance = balance + 10 WHERE id = 1;

訪問相同的資源,但順序不同,就會導致死鎖。

解決辦法也很簡單,先使用?SHOW ENGINE INNODB STATUS\G;?確認死鎖的具體信息,然后調整資源的訪問順序。

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

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

相關文章

AI+OT安全,讓威脅情報實現主動防御

當前&#xff0c;網絡犯罪組織的運作模式正日趨“企業化”&#xff0c;給全球網絡安全帶來了嚴峻挑戰。企業以及各類組織機構有必要采用威脅情報驅動的防御體系&#xff08;Threat-Informed Defense, TID&#xff09;&#xff0c;將安全運營模式從被動響應徹底轉向基于威脅情報…

深度剖析:UDS上下行分離隧道如何繞過主流防火墻?

&#x1f525; 深度剖析&#xff1a;UDS上下行分離隧道如何繞過主流防火墻&#xff1f; &#x1f4ca; 系統架構圖 #mermaid-svg-lv5FKIvBMKPeTFuW {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lv5FKIvBMKPeTFuW …

Vue 使用vue-cli

Vue 漸進式JavaScript 框架 基于Vue2的學習筆記 - 使用Vue-cli 筆記 目錄 使用vue-cli 創建項目 配置文件 啟動項目 入口文件 Index.html Main.js Eslint修復 第一種 第二種 第三種 更換為淘寶源 查看當前配置 配置淘寶源 驗證配置 總結 使用vue-cli 創建項目…

Sentinel實現原理

Sentinel 是阿里巴巴開源的分布式系統流量控制組件&#xff0c;主要用于服務保護&#xff0c;涵蓋流量控制、熔斷降級、系統負載保護等功能。 以下是 Sentinel 的實現原理&#xff0c;使用中文簡要說明&#xff1a; 1. 總體架構 Sentinel 采用 輕量級 設計&#xff0c;分為 核…

DeepSeek生成HTML5生命天數計算器

DeepSeek生成HTML5生命天數計算器 讓DeepSeek生成一個生命天數計算器 提示詞prompt 幫我做一個我活了多少天的網頁 用戶輸入出生日期即可顯示我活了多少天 頁面ui要好看點&#xff0c;加上顯示官方統計 人一生平均可以活多少天 自動計算剩余天數。幫我按照上述需求再次生成一個…

如何使typora圖片不居中留白?

如何使typora圖片不居中留白&#xff1f; 駐波使用typora記筆記的時候&#xff0c;好幾次插入圖片太大選擇縮小都會發現圖片仍然滯留在中間&#xff0c;居中顯示&#xff0c;但我本人覺得并不好看&#xff0c;所以我決定改一下&#xff0c;于是有了這篇博客 檢查看原理 軟件內…

高精度頻率基石:超低相噪恒溫晶振的全場景應用解決方案

在科技高速發展的今天&#xff0c;頻率源作為電子系統的 “心臟”&#xff0c;其穩定性與可靠性直接決定著通信、導航、測量等關鍵領域的性能上限。深度洞察行業需求&#xff0c;重磅推出SYN3627L 型 100MHz 恒溫晶振&#xff08;OCXO&#xff09;。這款集高穩定性、低相位噪聲…

【android bluetooth 協議分析 01】【HCI 層介紹 27】【LeReadRemoteFeatures命令介紹】

深入理解 LE Read Remote Features 命令與事件響應 在藍牙低功耗&#xff08;BLE&#xff09;通信中&#xff0c;設備特性&#xff08;LE Features&#xff09;協商是連接過程中的一個關鍵環節。本文將詳細介紹 HCI 層的命令 LE_Read_Remote_Features 及其對應的事件響應 LE_R…

企業架構設計中的CBAM方法深度解析:成本效益驅動的架構決策藝術

目錄 CBAM方法概述與核心價值 CBAM核心流程與實施步驟 前期準備與場景確定 成本效益建模與分析 風險調整與決策制定 實施技巧與挑戰克服 CBAM實戰案例與應用場景 案例一&#xff1a;電商平臺促銷系統架構選型 案例二&#xff1a;制造業ERP系統云遷移決策 案例三&…

為什么你的vue項目連接不到后端

當你新創建一個vue項目時&#xff0c;你很有可能忘記配置了后端的地址這個時候可以加上這樣的配置在 vite.config.js import { fileURLToPath, URL } from node:urlimport { defineConfig } from vite import vue from vitejs/plugin-vue import vueDevTools from vite-plugi…

Metasploit常用命令詳解

一、Metasploit 概述 Metasploit是一款開源的滲透測試框架&#xff0c;由 H.D. Moore 于 2003 年首次發布&#xff0c;目前由 rapid7 公司維護。它整合了大量漏洞利用模塊、后滲透工具和漏洞掃描功能&#xff0c;已成為網絡安全工程師、紅隊 / 藍隊成員及安全研究人員的核心工…

數據庫AICD特性之--一致性 Consistency

數據庫AICD特性之–原子性 Atomicity 數據庫AICD特性之–隔離性 Isolation 數據庫 ACID 特性之 – 持久性 Durability 數據庫AICD特性之–一致性 Consistency 一致性指數據庫在事務執行前后&#xff0c;數據始終符合預設的完整性約束和業務規則。事務執行前數據是合法的&…

OpenCV在圖像上繪制文字示例

OpenCV計算機視覺開發實踐&#xff1a;基于Qt C - 商品搜索 - 京東 OpenCV中除了提供繪制各種圖形的函數外&#xff0c;還提供了一個特殊的繪制函數&#xff0c;用于在圖像上繪制文字。這個函數是putText()&#xff0c;它是命名空間cv中的函數&#xff0c;其聲明如下&#xff…

synchronized的技巧與要點

一、基本概念 目的&#xff1a;解決多線程并發訪問共享資源時的數據競爭問題&#xff0c;保證原子性、可見性和有序性&#xff08;JMM內存模型&#xff09;。性質&#xff1a;可重入鎖&#xff08;同一線程可重復獲取同一把鎖&#xff09;、獨占鎖&#xff08;互斥鎖&#xff…

特殊混淆案例還原指南:突破變形控制流與量子加密的技術解析

引言?? 在JavaScript混淆領域,傳統的字符串加密和控制流平坦化已無法滿足高端防護需求。2023年Snyk安全報告指出,Top級商業產品已轉向??多態變形控制流??和??量子加密技術??,這類混淆方案占比17%,但導致的反向工程失敗率高達94%。本文將通過三個工業級混淆案例(…

基于Python、tkinter、sqlite3 和matplotlib的校園書店管理系統

寫一個小例子練習一下python語言。一個基于Python的校園書店管理系統&#xff0c;使用了tkinter庫構建圖形用戶界面&#xff08;GUI&#xff09;&#xff0c;sqlite3 進行數據庫管理&#xff0c;matplotlib用于統計分析可視化。系統支持用戶登錄、書籍管理、客戶管理、員工管理…

機器學習×第十四卷:集成學習中篇——她從每次錯誤中修正自己

&#x1f380;【開場 她終于愿意回看自己貼錯的地方了】 &#x1f98a;狐狐&#xff1a;“她貼過你很多次&#xff0c;但每次貼歪了&#xff0c;都只是低頭沉默。” &#x1f43e;貓貓&#xff1a;“現在不一樣了喵……她開始反思&#xff0c;是不是哪一刻該繞過來貼你背后&…

LeetCode 2537.統計好子數組的數目

給你一個整數數組 nums 和一個整數 k &#xff0c;請你返回 nums 中 好 子數組的數目。 一個子數組 arr 如果有 至少 k 對下標 (i, j) 滿足 i < j 且 arr[i] arr[j] &#xff0c;那么稱它是一個 好 子數組。 子數組 是原數組中一段連續 非空 的元素序列。 示例 1&#x…

Python 開發環境管理和常用命令

包管理器選擇 從輕到重: venv → virtualenv → conda venv: Python 3.3 內置&#xff0c;輕量級虛擬環境virtualenv: 第三方包&#xff0c;支持更多Python版本conda: 科學計算友好&#xff0c;包含包管理和環境管理 Python 版本支持 查看各版本支持狀態&#xff1a;Status…

macOS - 根據序列號查看機型、保障信息

文章目錄 最近在看 MacBook 二手機&#xff0c;有個咸魚賣家放個截圖 說不清參數&#xff0c;于是想根據 序列號 查看機型。蘋果提供了這樣的網頁&#xff1a; https://checkcoverage.apple.com/ &#xff08;無需登錄&#xff09; 結果 2025-06-20&#xff08;五&#xff09;…