面試必問:MySQL死鎖 是什麼,如何解決?(史上最全)

来源:https://www.cnblogs.com/jiang-xiao-bei/p/18226455
-Advertisement-
Play Games

MySQL死鎖接觸少,但面試又經常被問到怎麼辦? 最近有小伙伴在面試的時候,被問了MySQL死鎖,如何解決? 雖然也回答出來了,但是不夠全面體系化, 所以,小北給大家做一下系統化、體系化的梳理,幫助大家在面試過程中能夠脫穎而出,拿到自己心儀的Offer 插播一條:如果你近期準備面試跳槽,建議在htt ...


MySQL死鎖接觸少,但面試又經常被問到怎麼辦?

最近有小伙伴在面試的時候,被問了MySQL死鎖,如何解決? 雖然也回答出來了,但是不夠全面體系化,

所以,小北給大家做一下系統化、體系化的梳理,幫助大家在面試過程中能夠脫穎而出,拿到自己心儀的Offer

插播一條:如果你近期準備面試跳槽,建議在http://cxykk.com線上刷題,涵蓋 1萬+ 道 Java 面試題,幾乎覆蓋了所有主流技術面試題。

1. 什麼是MySQL死鎖?

MySQL中的死鎖是指兩個或多個操作相互等待對方釋放資源,結果導致他們都無法繼續執行的情況。

可以想象成兩個人各自拿著對方需要的東西,卻都僵持不下,誰也不願意先放手。

在資料庫操作中,這通常發生在多個事務同時試圖鎖定對方已鎖定的資源時。

2. MySQL鎖的分類

MySQL的鎖可以從操作的粒度進行分類,主要包括表級鎖行級鎖頁級鎖

不同類型的鎖在資料庫操作中的應用會影響資料庫的性能和併發處理能力。

表級鎖:

表級鎖是最簡單的鎖類型,當操作涉及到整個表時使用。

這種鎖會鎖定整個表,使得任何其他需要訪問這個表的操作都必須等待鎖被釋放。

例如:

--手動增加表鎖
lock table 表名稱 read(write),表名稱2 read(write);
--查看表上加過的鎖
show open tables;
--刪除表鎖
unlock tables;

優點是簡單易管理,但缺點是併發能力較低,尤其在處理大量事務時,效率會大大降低。

行級鎖:

行級鎖是最精細的鎖,只鎖定數據表中的特定行。

行級鎖的特點

  • 每次操作鎖住一行數據。開銷大,加鎖慢;
  • 會出現死鎖;
  • 鎖定粒度最小,發生鎖衝突的概率最低,併發度最高。

InnoDB相對於MYISAM的最大不同有兩點:

  • InnoDB支持事務(TRANSACTION)
  • InnoDB支持行級鎖

註意,InnoDB的行鎖實際上是針對索引加的鎖(在索引對應的索引項上做標記),不是針對整個行記錄加的鎖。並且該索引不能失效,否則會從行鎖升級為表鎖。(RR級別會升級為表鎖,RC級別不會升級為表鎖)

比如我們在RR級別執行如下sql:

--where條件里的name欄位無索引
select * from account where name = 'lilei' for update

則其它Session對該表任意一行記錄做修改操作都會被阻塞住

頁級鎖:

頁級鎖介於表級鎖和行級鎖之間,不是MySQL預設使用的鎖類型。

它鎖定資料庫頁(即一組行),粒度比表級鎖細,但比行級鎖粗。頁

級鎖可以減少鎖的數量,從而降低鎖競爭,但可能會引起更多的鎖衝突,尤其是當多個事務頻繁修改相鄰的數據時。

插播一條:如果你近期準備面試跳槽,建議在http://cxykk.com線上刷題,涵蓋 1萬+ 道 Java 面試題,幾乎覆蓋了所有主流技術面試題。

3 從操作的類型進行的mysql鎖的分類

讀鎖(S鎖):

  • 性能特點:

讀鎖也被稱為共用鎖,它允許一個事務去讀取一行數據,並防止其他事務對這行數據進行寫操作,直到讀鎖被釋放。

但是,多個事務可以同時持有對同一資源的讀鎖,這意味著多個用戶可以同時讀取數據,而不會相互影響。

例如:

select * from T where id=1 lock in share mode
  • 適用場景:

適用於那些讀取操作遠多於寫入操作的場景。

因為讀鎖可以共用,它支持高併發的讀取操作,使得多個用戶可以同時查詢數據而不會阻塞彼此。

寫鎖(X鎖):

  • 性能特點:

寫鎖又稱為排他鎖,當一個事務對數據進行修改時,它會加上寫鎖。這個鎖會阻止其他任何事務讀取或修改同一數據,直到寫鎖被釋放。

寫鎖保證了數據在修改期間的完整性和一致性。

例如:

select * from T where id=1 for update
  • 適用場景:

適用於需要修改數據的操作。

由於寫鎖會阻塞其他所有試圖訪問相同數據的操作,所以在寫入量大或者數據頻繁更新的應用中,寫鎖可能會成為性能瓶頸。

意向鎖:

  • 性能特點:

意向鎖是一種較為特殊的鎖,它不直接鎖定數據,而是表明一個事務意圖對數據行進行加鎖(讀鎖或寫鎖)。

意向鎖主要分為

  • 意向共用鎖,IS鎖,對整個表加共用鎖之前,需要先獲取到意向共用鎖。
  • 意向排他鎖,IX鎖,對整個表加排他鎖之前,需要先獲取到意向排他鎖。

這主要用於支持多級鎖定協議,通過在表級別設置意向鎖,來預告即將在行級別上加的鎖,這樣就能在不同粒度的鎖之間提供一種相容性檢查。

  • 適用場景:

意向鎖主要用於提高併發性能,特別是在存在多粒度鎖定(即同時使用表級鎖和行級鎖)的情況下。

它允許資料庫系統更有效地管理鎖,避免不必要的鎖衝突,提高操作效率。

4 從操作的性能進行的mysql鎖的分類

從操作的性能可分為樂觀鎖和悲觀鎖

  1. 樂觀鎖
  • 性能特點:

樂觀鎖基於這樣一個假設,即衝突發生的概率較低,大多數時間不會有衝突。

因此,它在操作過程中不會立即鎖定資源。通常,樂觀鎖會通過檢查數據在讀取和更新期間是否被修改來實現,常用的方法是使用版本號或時間戳。只有在數據提交更新時,才會檢查版本信息是否一致,如果不一致,表示數據在此期間已被其他操作更改,此時操作會失敗。

  • 適用場景:

適用於讀多寫少的場景,比如線上閱讀平臺的用戶數據處理,因為在這種場景中,數據衝突的可能性較低,使用樂觀鎖可以減少鎖的開銷,提高系統的整體性能。

  1. 悲觀鎖
  • 性能特點:

悲觀鎖恰恰相反,它假設衝突很常見,因此在整個數據處理過程中會保持數據鎖定,直到事務完成。

這意味著當一個事務在操作數據時,其他事務必須等待直到鎖被釋放。悲觀鎖可以通過資料庫自帶的鎖機制實現,比如行鎖或表鎖。

  • 適用場景:

適合寫操作多的場景,比如銀行賬戶處理,在這種場景下,數據安全和一致性比性能更為重要。悲觀鎖通過鎖定數據來避免數據在多個事務間的衝突,確保數據操作的安全性。

5 InnoDB存儲引擎三種行鎖模式

當我們談論InnoDB存儲引擎中的行鎖模式時,可以把它想象成一種確保資料庫中數據安全和準確的機制。這裡有三種主要的行鎖模式,分別是記錄鎖、間隙鎖和臨鍵鎖。

5.1、記錄鎖(Record Locks):

記錄鎖是最直接的一種鎖。它就像是給資料庫中某條具體數據上了一把鎖。

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

-Advertisement-
Play Games
更多相關文章
  • 系統編程 POSIX信號量 題目 設計一個程式,主線程需要創建2個子線程之後主線程終止,此時進程中有2個子線程A和B,此時進程中有一個臨界資源flag,子線程A獲取觸摸屏坐標並判斷坐標值是否在LCD屏的左上角,如果坐標範圍滿足左上角,則利用條件量和互斥鎖來喚醒子線程B,子線程B的任務是判斷flag ...
  • 目錄題目解析代碼結果展示 題目 解析 ​ 該題主要依靠條件量和互斥鎖來實現線程之間的同步與互斥,分析主線程、線程A和線程B的任務如下: 主線程: 打開LCD屏和觸摸屏的硬體文件,並分別存儲兩個文件的文件描述符,方便後面進行條件判斷。 開啟線程A和線程B。 定義並初始化條件量和互斥量,方便後續線程內進 ...
  • 任務的掛起與恢復的API函數介紹 API函數 描述 vTaskSuspend() 掛起任務 vTaskResume() 恢復被掛起的任務 xTaskResumeFromISR() 在中斷中恢復被掛起的任務 1、掛起任務類似暫停,可恢復; 刪除任務,無法恢復 2、恢復是恢復被掛起任務 3、帶FromI ...
  • VXLAN在雲網路中應用十分廣泛。本文介紹一種方法在兩台Linux主機之間建立簡單的VXLAN隧道,以供學習、研究之用。 ...
  • 很多APP都需要主動向用戶推送消息,這就需要用到長連接的服務,即我們通常提到的websocket,同樣也是使用socket服務,通信協議是基本類似的,在go中用的最多的、也是最簡單的socket服務就是gorilla/websocket,它有21.1K的star,足以說明它的受歡迎程度, 它的git ...
  • 本文測試環境為SQLserver2019 背景 某業務流水錶,會基於固定範圍內的業務編號做寫入以及查詢操作,熱數據的量級在億級別,一個典型的查詢是基於業務編碼查詢最新(時間戳)某種狀態的前N條數據 簡化後的表結構如下 create table TestTable01 ( id bigint iden ...
  • 資料庫引入LLVM之後,可以為具體的查詢生成定製化的機器碼,並儘可能地將數據存儲在CPU的寄存器中進一步加快計算的速度。 ...
  • Redis事務與MySQL事務 不一樣。 原子性:MySQL有Undo Log機制,支持強原子性,和回滾。Redis只能保證事務內指令可以不被干擾的在同一批次執行,且沒有機制保證全部成功則提交,部分失敗則回滾。 隔離性:MySQL的隔離性指多個事務可以併發執行,MySQL有MVCC機制。而Redis ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...