數據庫的死鎖相關(一)

目錄

前言

一、什么死鎖

二、產生死鎖的必要條件

三、死鎖發生的具體位置和場景

1. 數據行級別死鎖(最常見)

2. 表級別死鎖

3. 索引間隙鎖死鎖(InnoDB特有)

4. 外鍵約束死鎖

5. 元數據鎖死鎖

6. 內存中的鎖結構死鎖

7. 分布式系統死鎖

如何定位死鎖位置

四、關鍵點總結


前言

????????沒有實踐就沒有發言權,前段時間無聊時,刷到數據庫死鎖相關的。發現自己對這部分有所空缺,查資料進行總結實踐,得出自我觀點。


一、什么死鎖

????????數據庫死鎖是指兩個或多個事務在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,這些事務都將無法繼續執行下去。


二、產生死鎖的必要條件

1. 互斥條件 (Mutual Exclusion)

  • 資源一次只能由一個事務獨占使用
  • 例如:某一行數據在同一時間只能被一個事務鎖定

2. 占有并等待 (Hold and Wait)

  • 事務已經持有至少一個資源,同時又在等待獲取其他事務持有的資源
  • 例如:事務A持有記錄1的鎖,同時請求記錄2的鎖

3. 非搶占條件 (No Preemption)

  • 已分配給事務的資源不能被強制剝奪,只能由持有者顯式釋放
  • 數據庫中的鎖通常不能強行從另一個事務中奪取

4. 循環等待 (Circular Wait)

  • 存在一個事務等待環路,每個事務都在等待下一個事務所持有的資源
  • ?例如:T1等待T2,T2等待T3,T3等待T1

三、死鎖發生的具體位置和場景

1. 數據行級別死鎖(最常見)

發生位置

  • 表中的特定數據行

  • 索引記錄(包括主鍵索引和二級索引)

典型場景

-- 事務A
UPDATE users SET balance = balance - 100 WHERE id = 1; -- 鎖住id=1的行
UPDATE users SET balance = balance + 100 WHERE id = 2; -- 嘗試鎖住id=2的行(等待)-- 事務B
UPDATE users SET balance = balance - 50 WHERE id = 2; -- 鎖住id=2的行
UPDATE users SET balance = balance + 50 WHERE id = 1; -- 嘗試鎖住id=1的行(等待)

2. 表級別死鎖

發生位置

  • 整個數據表

  • 表鎖(如MySQL的MyISAM引擎)

典型場景

-- 事務A
LOCK TABLE orders WRITE; -- 獲取orders表鎖
-- 嘗試獲取customers表鎖(等待)-- 事務B
LOCK TABLE customers WRITE; -- 獲取customers表鎖
-- 嘗試獲取orders表鎖(等待)

3. 索引間隙鎖死鎖(InnoDB特有)

發生位置

  • 索引記錄之間的間隙

  • 不存在的記錄范圍

典型場景

-- 事務A
SELECT * FROM accounts WHERE id > 100 FOR UPDATE; -- 鎖住id>100的間隙
-- 事務B同時執行
SELECT * FROM accounts WHERE id < 50 FOR UPDATE;  -- 鎖住id<50的間隙
-- 當兩個事務嘗試向對方鎖定的間隙插入數據時可能死鎖

4. 外鍵約束死鎖

發生位置

  • 主表和從表的外鍵關系處

  • 級聯更新/刪除操作時

典型場景

-- 事務A
UPDATE parent_table SET id = 2 WHERE id = 1; -- 需要檢查/鎖定子表外鍵
-- 事務B同時
UPDATE child_table SET parent_id = 3 WHERE parent_id = 2; -- 需要檢查/鎖定父表

5. 元數據鎖死鎖

發生位置

  • 數據字典(表結構)

  • 在執行DDL和DML并發時

典型場景

-- 事務A
BEGIN;
SELECT * FROM products; -- 獲取元數據讀鎖
-- 事務B同時執行
ALTER TABLE products ADD COLUMN description TEXT; -- 需要元數據寫鎖(等待)
-- 如果事務A后續嘗試執行需要元數據升級的操作可能死鎖

6. 內存中的鎖結構死鎖

發生位置

  • 數據庫內部鎖管理結構

  • 緩沖池中的頁鎖

典型場景

  • 多個事務競爭同一內存頁的訪問權限

  • 鎖管理數據結構本身的并發控制問題


7. 分布式系統死鎖

發生位置

  • 跨數據庫節點

  • 跨不同服務/微服務

典型場景

節點A的服務1: 鎖定資源X,請求節點B的資源Y
節點B的服務2: 鎖定資源Y,請求節點A的資源X

四、如何定位死鎖位置

1. MySQL

SHOW ENGINE INNODB STATUS\G;
-- 查看"LATEST DETECTED DEADLOCK"部分

2. SQL Server

SELECT * FROM sys.dm_tran_locks;
-- 查看死鎖圖

3. Oracle

SELECT * FROM v$locked_object;
SELECT * FROM dba_blockers;

五、關鍵點總結

  1. 死鎖最常發生在行級鎖和間隙鎖上

  2. 不同數據庫引擎的死鎖熱點位置不同(如InnoDB主要在索引記錄)

  3. 死鎖不僅發生在數據上,也可能發生在系統內部資源上

  4. 分布式環境死鎖范圍更廣,更難檢測


那要如何解決上述問題請跳轉:數據庫的死鎖相關(二)

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

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

相關文章

Three.js + React 實戰系列-3D 個人主頁:構建 Hero 場景組件(項目核心)?

在本節中&#xff0c;我們將完成整個 3D 主業項目中最核心的組件 —— Hero.jsx。 這個組件作為首頁的主視覺部分&#xff0c;整合了 3D 模型、動畫相機、交互按鈕與自適應布局&#xff0c;構建出一個立體、酷炫、可交互的主場景。 前置準備&#xff1a; ?安裝依賴&#xff…

Electron Forge【實戰】桌面應用 —— 將項目配置保存到本地

最終效果 定義默認配置 src/initData.ts export const DEFAULT_CONFIG: AppConfig {language: "zh",fontSize: 14,providerConfigs: {}, };src/types.ts export interface AppConfig {language: zh | enfontSize: numberproviderConfigs: Record<string, Recor…

RPG4.設置角色輸入

這一篇是進行玩家移動和視角移動的介紹。 1.在玩家內進行移動覆寫 virtual void SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) override; 2.創建增強輸入資產的變量創建 UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category "CharacterD…

[實戰] Petalinux驅動開發以及代碼框架解讀

目錄 Petalinux驅動開發以及代碼框架解讀一、引言二、步驟2.1 創建PetaLinux工程2.2 配置硬件描述文件2.3 設備樹配置2.4 建立驅動框架2.5 編輯 .bb 文件2.6 編寫驅動文件2.7 編寫 Makefile2.8 驗證配方配置2.9 集成驅動到 RootFS2.10 全系統編譯與部署2.11 啟動驗證 三、框架解…

[特殊字符] 開發工作高內存占用場景下,Windows 內存壓縮機制是否應該啟用?實測分析與優化建議

在日常開發中&#xff0c;我們往往需要同時運行多個高占用內存的工具&#xff0c;例如&#xff1a; IntelliJ IDEA VMware 虛擬機 多個 Java 后端程序 這些應用程序非常“吃內存”&#xff0c;輕松就能把 16GB、甚至 24GB 的物理內存用滿。那么&#xff0c;Windows 的“內存…

嵌入式學習筆記 - HAL_xxx_MspInit(xxx);函數

使用cubeMX生成的HAL庫函數中&#xff0c;所有外設的初始化函數HAL_xxx_Init(&xxxHandle)中都存在有此調用函數HAL_xxx_MspInit(xxx)&#xff0c;此調用函數其實是對各外設模塊比如UART&#xff0c;I2C等控制器使用的的底層硬件進行初始化&#xff0c;包括時鐘&#xff0c;…

Nginx — http、server、location模塊下配置相同策略優先級問題

一、配置優先級簡述 在 Nginx 中&#xff0c;http、server、location 模塊下配置相同策略時是存在優先級的&#xff0c;一般遵循 “范圍越小&#xff0c;優先級越高” 的原則&#xff0c;下面為你詳細介紹&#xff1a; 1. 配置繼承關系 http 塊&#xff1a;作為全局配置塊&…

WPF之TextBlock控件詳解

文章目錄 1. TextBlock控件介紹2. TextBlock的基本用法2.1 基本語法2.2 在代碼中創建TextBlock 3. TextBlock的常用屬性3.1 文本內容相關屬性3.2 字體相關屬性3.3 外觀相關屬性3.4 布局相關屬性 4. TextBlock文本格式化4.1 使用Run元素進行內聯格式化4.2 其他內聯元素 5. 處理長…

華為云loT物聯網介紹與使用

&#x1f310; 華為云 IoT 物聯網平臺詳解&#xff1a;構建萬物互聯的智能底座 隨著萬物互聯時代的到來&#xff0c;物聯網&#xff08;IoT&#xff09;已成為推動數字化轉型的關鍵技術之一。華為云 IoT 平臺&#xff08;IoT Device Access&#xff09;作為華為云的核心服務之…

AnimateCC教學:形狀補間動畫的代碼實現

核心代碼: var shape; var animationProps = {width: 50,height: 50,cornerRadius: 0,color: "#00FF00" }; function init() { shape = new createjs.Shape();shape.x = 200;shape.y = 150;stage.addChild(shape);// 初始繪制updateShape();// 設置補間動畫createTw…

Android學習總結之Retrofit篇

1. 注解原理概述 在 Java 里&#xff0c;注解是一種元數據&#xff0c;它為代碼提供額外信息但不影響程序的實際邏輯。注解可以在類、方法、字段等元素上使用&#xff0c;并且能在編譯時、運行時通過反射機制被讀取。Retrofit 充分利用了 Java 注解機制&#xff0c;通過自定義…

windows11 編譯 protobuf-3.21.12 c++

下載 protobuf 包&#xff0c;本文使用 3.21.12 版本&#xff0c;Gitub下載鏈接&#xff1a; Github官網 , 網盤下載&#xff1a; 網盤 如果電腦環境沒有安裝 cmake 則需要安裝&#xff0c;本文測試使用 cmake-3.25.1 版本&#xff0c; 下載地址&#xff1a;[camke-3.25.1] (…

Java繼承中super的使用方法

super 關鍵字在 Java 中用于訪問父類的成員&#xff08;包括字段、方法和構造函數&#xff09;。當你在子類中調用父類的方法或訪問父類的成員變量時&#xff0c;super 是必不可少的工具。 &#x1f511; super 的基本用法 1. 調用父類的構造方法 在子類的構造方法中&#x…

網絡安全之淺析Java反序列化題目

前言 這段時間做了幾道Java反序列化題目&#xff0c;發現很多題目都是類似的&#xff0c;并且可以通過一些非預期gadget打進去&#xff0c;就打算總結一下常見的題目類型以及各種解法&#xff0c;并提煉出一般性的思維方法。 正文 分析入口點 拿到題目&#xff0c;有附件最…

動態規劃問題,下降路徑最小和(dp初始化問題,狀態壓縮),單詞拆分(回溯法+剪枝+記憶化),substr函數

下降路徑最小和 題目鏈接&#xff1a; 931. 下降路徑最小和 - 力扣&#xff08;LeetCode&#xff09; 題目描述&#xff1a; 給你一個 n x n 的 方形 整數數組 matrix &#xff0c;請你找出并返回通過 matrix 的下降路徑 的 最小和 。 下降路徑 可以從第一行中的任何元素開…

大數據治理自動化與智能化實踐指南:架構、工具與實戰方案(含代碼)

??個人主頁??:一ge科研小菜雞-CSDN博客 ????期待您的關注 ???? 一、引言:從人治到機治,數據治理正在進化 隨著數據體量持續膨脹、數據場景復雜化,傳統依賴人工規則的大數據治理方式已難以為繼。企業在治理過程中面臨: 數據質量問題激增,人工檢測成本高 元數…

Golang - 實現文件管理服務器

先看效果&#xff1a; 代碼如下&#xff1a; package mainimport ("fmt""html/template""log""net/http""os""path/filepath""strings" )// 配置根目錄&#xff08;根據需求修改&#xff09; //var ba…

Linux-04-用戶管理命令

一、useradd添加新用戶: 基本語法: useradd 用戶名:添加新用戶 useradd -g 組名 用戶:添加新用戶到某個組二、passwd設置用戶密碼: 基本語法: passwd 用戶名:設置用戶名密碼 三、id查看用戶是否存在: 基本語法: id 用戶名 四、su切換用戶: 基本語法: su 用戶名稱:切換用…

Ollama 安裝 QWen3 及配置外網訪問指南

一、Ollama 安裝 QWen3 安裝步驟 首先嘗試運行 QWen3 模型&#xff1a; ollama run qwen3 如果遇到版本不兼容錯誤&#xff08;Error 412&#xff09;&#xff0c;表示需要升級 Ollama&#xff1a; curl -fsSL https://ollama.com/install.sh | sh 驗證版本&#xff1a; o…

高性能架構設計-數據庫(讀寫分離)

一、高性能數據庫簡介 1.高性能數據庫方式 讀寫分離&#xff1a;將訪問壓力分散到集群中的多個節點&#xff0c;沒有分散存儲壓力 分庫分表&#xff1a;既可以分散訪問壓力&#xff0c;又可以分散存儲壓力 2.為啥不用表分區 如果SQL不走分區鍵&#xff0c;很容易出現全表鎖…