数据库的死锁相关(一)

目录

前言

一、什么死锁

二、产生死锁的必要条件

三、死锁发生的具体位置和场景

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.mzph.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;很容易出现全表锁…