如何使用不同的索引更新解决MySQL死锁
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,这篇文章给大家分享的是有关如何使用不同的索引更新解决MySQL死锁的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。示例如下CREATE TABLE `t3` ( `id` i
千家信息网最后更新 2025年11月07日如何使用不同的索引更新解决MySQL死锁
这篇文章给大家分享的是有关如何使用不同的索引更新解决MySQL死锁的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
示例如下
CREATE TABLE `t3` ( `id` int(11) NOT NULL AUTO_INCREMENT, `a` varchar(5), `b` varchar(5), PRIMARY KEY (`id`), UNIQUE KEY `uk_a` (`a`), KEY `idx_b` (`b`) )INSERT INTO `t3` (`id`, `a`, `b`) VALUES (1,'1','2');# sql语句如下# 事务1:t1update t3 set b = '' where a = "1";# 事务2:t2update t3 set b = '' where b = "2";
两条语句造成死锁的情况用手动的方式比较难复现,我们先来分析一下加锁的过程
第一条语句(通过唯一索引去更新记录)
update t3 set b = '' where a = "1";
整理一下,加了3个X锁,顺序分别是
| 序号 | 索引 | 锁类型 |
|---|---|---|
| 1 | uk_a | X |
| 2 | PRIMARY | X |
| 3 | idx_b | X |
第二条语句
update t3 set b = '' where b = "2";

整理一下,加了 3 个 X 锁,顺序分别是
| 序号 | 索引 | 锁类型 |
|---|---|---|
| 1 | idx_b | X |
| 2 | PRIMARY | X |
| 3 | idx_b | X |
两条语句从加锁顺序看起来就已经有构成死锁的条件了
手动是比较难模拟的,写个代码并发的去同时执行那两条 SQL 语句,马上就出现死锁了
------------------------LATEST DETECTED DEADLOCK------------------------181102 12:45:05*** (1) TRANSACTION:TRANSACTION 50AF, ACTIVE 0 sec starting index readmysql tables in use 1, locked 1LOCK WAIT 3 lock struct(s), heap size 376, 2 row lock(s)MySQL thread id 34, OS thread handle 0x70000d842000, query id 549 localhost 127.0.0.1 root Searching rows for updateupdate t3 set b = '' where b = "2"*** (1) WAITING FOR THIS LOCK TO BE GRANTED:RECORD LOCKS space id 67 page no 3 n bits 72 index `PRIMARY` of table `d1`.`t3` trx id 50AF lock_mode X locks rec but not gap waitingRecord lock, heap no 2 PHYSICAL RECORD: n_fields 5; compact format; info bits 0 0: len 4; hex 80000001; asc ;; 1: len 6; hex 0000000050ae; asc P ;; 2: len 7; hex 03000001341003; asc 4 ;; 3: len 1; hex 31; asc 1;; 4: len 0; hex ; asc ;;*** (2) TRANSACTION:TRANSACTION 50AE, ACTIVE 0 sec updating or deletingmysql tables in use 1, locked 14 lock struct(s), heap size 1248, 3 row lock(s), undo log entries 1MySQL thread id 35, OS thread handle 0x70000d885000, query id 548 localhost 127.0.0.1 root Updatingupdate t3 set b = '' where a = "1"*** (2) HOLDS THE LOCK(S):RECORD LOCKS space id 67 page no 3 n bits 72 index `PRIMARY` of table `d1`.`t3` trx id 50AE lock_mode X locks rec but not gapRecord lock, heap no 2 PHYSICAL RECORD: n_fields 5; compact format; info bits 0 0: len 4; hex 80000001; asc ;; 1: len 6; hex 0000000050ae; asc P ;; 2: len 7; hex 03000001341003; asc 4 ;; 3: len 1; hex 31; asc 1;; 4: len 0; hex ; asc ;;*** (2) WAITING FOR THIS LOCK TO BE GRANTED:RECORD LOCKS space id 67 page no 5 n bits 72 index `idx_b` of table `d1`.`t3` trx id 50AE lock_mode X locks rec but not gap waitingRecord lock, heap no 2 PHYSICAL RECORD: n_fields 2; compact format; info bits 0 0: len 1; hex 32; asc 2;; 1: len 4; hex 80000001; asc ;;*** WE ROLL BACK TRANSACTION (1)
分析一下死锁日志
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:RECORD LOCKS space id 67 page no 3 n bits 72 index PRIMARY of table d1.t3 trx id 50AF lock_mode X locks rec but not gap waiting
事务2:想获取主键索引的 X 锁
*** (2) HOLDS THE LOCK(S):RECORD LOCKS space id 67 page no 3 n bits 72 index PRIMARY of table d1.t3 trx id 50AE lock_mode X locks rec but not gap
事务1:持有主键索引的 X 锁
*** (2) WAITING FOR THIS LOCK TO BE GRANTED:RECORD LOCKS space id 67 page no 5 n bits 72 index idx_b of table d1.t3 trx id 50AE lock_mode X locks rec but not gap waiting
事务1:想获取普通索引 idx_b 的 X 锁
与我们分析的完全一致,也与线上的死锁日志一模一样
感谢各位的阅读!关于"如何使用不同的索引更新解决MySQL死锁"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
索引
死锁
语句
事务
更新
顺序
分析
不同
内容
序号
手动
日志
更多
篇文章
类型
不错
实用
普通
一致
一模一样
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
多条件筛选去重复的数据库
服务器延迟怎么修复
网站服务器安全措施
网络安全等级保护认证
网络技术和通信工程的区别
中行软件开发中心招聘人数
网络安全主题用语
网络技术等级认证
服务器 账号管理工具
服务器登录有记录吗
电商app模板软件开发
方向软件数据库损坏
联想软件开发加班情况
云服务器怎么添加安全规则
网络安全宣传周颍上工会在行动
国家网络安全周举办时间
小区道闸系统怎么导入车辆数据库
2019网络安全专业
物联网标准仓软件开发定制怎么做
通天下网络技术
网络安全的特点包括
云服务器的医药管理软件
郑州网络安全系统品牌
紫色魔雨数据库连接失败
ibm服务器有必要双通道吗
内蒙古有网络技术有限公司
北斗服务器怎么样
网络安全法25条的理解
服务器寄送德邦快递怎么样
计算机三级考试网络技术填空题