php网站后台进不去,个人网页设计思维导图,怎样使用网站模板,群晖 docker wordpress目录
前言
一、什么死锁
二、产生死锁的必要条件
三、死锁发生的具体位置和场景
1. 数据行级别死锁#xff08;最常见#xff09;
2. 表级别死锁
3. 索引间隙锁死锁#xff08;InnoDB特有#xff09;
4. 外键约束死锁
5. 元数据锁死锁
6. 内存中的锁结构死锁
7.…目录
前言
一、什么死锁
二、产生死锁的必要条件
三、死锁发生的具体位置和场景
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等待T2T2等待T3T3等待T1 三、死锁发生的具体位置和场景
1. 数据行级别死锁最常见
发生位置 表中的特定数据行 索引记录包括主键索引和二级索引
典型场景
-- 事务A
UPDATE users SET balance balance - 100 WHERE id 1; -- 锁住id1的行
UPDATE users SET balance balance 100 WHERE id 2; -- 尝试锁住id2的行(等待)-- 事务B
UPDATE users SET balance balance - 50 WHERE id 2; -- 锁住id2的行
UPDATE users SET balance balance 50 WHERE id 1; -- 尝试锁住id1的行(等待) 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; -- 锁住id100的间隙
-- 事务B同时执行
SELECT * FROM accounts WHERE id 50 FOR UPDATE; -- 锁住id50的间隙
-- 当两个事务尝试向对方锁定的间隙插入数据时可能死锁 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; 五、关键点总结 死锁最常发生在行级锁和间隙锁上 不同数据库引擎的死锁热点位置不同如InnoDB主要在索引记录 死锁不仅发生在数据上也可能发生在系统内部资源上 分布式环境死锁范围更广更难检测 那要如何解决上述问题请跳转数据库的死锁相关二)