美文网首页
两次死锁的分析

两次死锁的分析

作者: 十毛tenmao | 来源:发表于2020-09-16 23:07 被阅读0次

最近业务上连续出现了两次死锁逻辑,两次都是特别简单的SQL语句,分析后才发现自己对InnoDB加锁了解得太浅了。

表结构

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(64) NOT NULL,
  `age` int(11) DEFAULT NULL,
  `deleted` int(22) DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

主键id和唯一键name

死锁场景一

  • SQL语句
select * from user where name='tenmao' for update;
insert into user(`name`) values('tenmao');
  • 死锁日志
------------------------
LATEST DETECTED DEADLOCK
------------------------
2020-09-16 20:23:21 0x7f4b8b596700
*** (1) TRANSACTION:
TRANSACTION 425593, ACTIVE 21 sec inserting
mysql tables in use 1, locked 1
LOCK WAIT 3 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1
MySQL thread id 65439, OS thread handle 139962440095488, query id 2992052 localhost maibao update
insert into user(`name`) values('tenmao')
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 370 page no 4 n bits 72 index uk_name of table `tenmao`.`user` trx id 425593 lock_mode X insert intention waiting
Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0
 0: len 8; hex 73757072656d756d; asc supremum;;

*** (2) TRANSACTION:
TRANSACTION 425594, ACTIVE 12 sec inserting
mysql tables in use 1, locked 1
3 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1
MySQL thread id 65440, OS thread handle 139962437166848, query id 2992053 localhost maibao update
insert into user(`name`) values('tenmao')
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 370 page no 4 n bits 72 index uk_name of table `tenmao`.`user` trx id 425594 lock_mode X
Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0
 0: len 8; hex 73757072656d756d; asc supremum;;

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 370 page no 4 n bits 72 index uk_name of table `tenmao`.`user` trx id 425594 lock_mode X insert intention waiting
Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0
 0: len 8; hex 73757072656d756d; asc supremum;;

*** WE ROLL BACK TRANSACTION (2)
  • 死锁分析
T1 T2
select * from user where name='tenmao' for update 记录不存在所以获取gap锁,模式是X
select * from user where name='tenmao' for update 记录不存在所以获取gap锁,模式是X(因为gap锁之间不冲突,所以可以获取)
insert into user(`name`) values('tenmao') 插入需要获取插入意向锁。因为与T2的gap锁冲突,需要等待
insert into user(`name`) values('tenmao') 插入需要获取插入意向锁。。因为与T1的gap锁冲突,需要等待。死锁!

死锁场景二

  • SQL语句
insert into user(`name`) values('tenmao');
  • 死锁分析
T1 T2
insert into user(`name`) values('tenmao') 第一阶段,需要判断duplicate key,所以获取S锁,类型是gap
insert into user(`name`) values('tenmao') 第一阶段,需要判断duplicate key,所以获取S锁,类型是gap
第二阶段,S锁升级为X锁。等待T2释放S锁
第二阶段,S锁升级为X锁。等待T2释放S锁(死锁)

以上过程,因为S锁升级为X锁的时间间隔很短,所以不是很好复现,一般在高并发的时候出现。不过可以用3个事务来复现:

T1 T2 T3
insert into user(`name`) values('tenmao'); 先获取S锁判断duplicate key,插入前升级为X锁
insert into user(`name`) values('tenmao'); 第一阶段,需要判断duplicate key,所以获取S锁,类型是gap,与T1的X锁冲突,等待
insert into user(`name`) values('tenmao'); 第一阶段,需要判断duplicate key,所以获取S锁,类型是gap,与T1的X锁冲突,等待
rollback 获取到S锁,类型是gap 获取到S锁,类型是gap
第二阶段,S锁升级为X锁。等待T3释放S锁(死锁) 第二阶段,S锁升级为X锁。等待T2释放S锁(死锁)

参考

相关文章

  • 两次死锁的分析

    最近业务上连续出现了两次死锁逻辑,两次都是特别简单的SQL语句,分析后才发现自己对InnoDB加锁了解得太浅了。 ...

  • 记录一次 mysql 死锁 (患者 为 index merge)

    几点 读懂死锁日志 日志分析 基础知识补习 死锁 原因分析 解决办法 写在最后的 锁 读懂死锁日志 第一步 先登录...

  • mysql upate join 死锁分析

    之前遇到的死锁分析,记录下 死锁信息如下: *** (1) TRANSACTION:TRANSACTION 436...

  • mysql 死锁排查

    一、show ENGINE INNODB status查看死锁位置,分析。 二、首先解决死锁可以从死锁发生的条件入...

  • 一则由于索引导致的MySQL死锁分析

    涉及死锁的 authorized_user 表的 DDL 死锁日志 根据 MySQL 日志分析出来的涉及死锁的 S...

  • Android死锁的场景有哪些?

    常见的死锁的场景 下面分析几种常见的死锁形式: 锁顺序死锁 上述代码中,如果一个线程调用lockAtoB(),另一...

  • 异常引起的死锁

    [toc] 介绍 一个json异常导致的死锁分析。同事某天求助帮忙分析一个死锁dump,按照之前查找临界区的方法,...

  • 多线程分析——死锁代码demo

    前言 本文主要是对Java多线程死锁代码demo的分析,对其过程以及死锁进行了大致的概括,希望对大家有帮助。 死锁...

  • mysql死锁日志分析和并发批量插入导致死锁分析

    查看死锁日志 通过一下命令行查看到死锁日志 死锁日志分析 日志1 ①:表示事务1的id是39474。 ②和③:表示...

  • 5.技术-mysql(五)-死锁

    一.背景 上篇分析了加锁的场景,这一节可以借助对加锁细节的了解来分析程序中出现的死锁。以及避免死锁。本节通过理论...

网友评论

      本文标题:两次死锁的分析

      本文链接:https://www.haomeiwen.com/subject/diahyktx.html