测试环境: mysql 5.7.18     RR隔离级别

创建表,插入部分测试数据

CREATE TABLE yhtest (
 a INT (11) NOT NULL AUTO_INCREMENT,
 b INT (11) DEFAULT NULL,
 c INT (11) DEFAULT NULL,
 PRIMARY KEY (a),
 unique key(b)
) ENGINE = INNODB ;

INSERT INTO yhtest VALUE (1, 1, 1),
(2, 2, 2),
(3, 3, 3),
(4, 4, 4),
(5, 5, 5),
(6, 6, 6),
(7, 7, 7),
(8, 8, 8),
(9, 9, 9),
(10, 10, 10),
(11, 11, 11) ;

操作:

事物1:begin;

事物2:begin;

事物1:delete from yhtest where a=2;    可以执行

事物2:delete from yhtest where a=3;    可以执行

事物1:delete from yhtest where a=4;     可以执行

事物2:delete from yhtest where a=5;    可以执行

事物1:insert into yhtest value(2,2,2);     锁等待,待事物2回滚后,可以执行

事物2: insert into yhtest value(3,3,3);    报出死锁,回滚,如下:

死锁日志:

------------------------
LATEST DETECTED DEADLOCK
------------------------
2017-10-27 19:38:00 0x7f4b67932700
*** (1) TRANSACTION:
TRANSACTION 3914, ACTIVE 117 sec inserting
mysql tables in use 1, locked 1
LOCK WAIT 6 lock struct(s), heap size 1136, 7 row lock(s), undo log entries 3
MySQL thread id 4, OS thread handle 139961837504256, query id 53 localhost root update
insert into yhtest value(2,2,2)
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 31 page no 4 n bits 80 index b of table `test`.`yhtest` trx id 3914 lock mode S waiting
Record lock, heap no 4 PHYSICAL RECORD: n_fields 2; compact format; info bits 32
0: len 4; hex 80000003; asc     ;;
1: len 4; hex 80000003; asc     ;;

*** (2) TRANSACTION:
TRANSACTION 3919, ACTIVE 93 sec inserting
mysql tables in use 1, locked 1
6 lock struct(s), heap size 1136, 6 row lock(s), undo log entries 3
MySQL thread id 5, OS thread handle 139961836971776, query id 54 localhost root update
insert into yhtest value(3,3,3)
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 31 page no 4 n bits 80 index b of table `test`.`yhtest` trx id 3919 lock_mode X locks rec but not gap
Record lock, heap no 4 PHYSICAL RECORD: n_fields 2; compact format; info bits 32
0: len 4; hex 80000003; asc     ;;
1: len 4; hex 80000003; asc     ;;

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 31 page no 4 n bits 80 index b of table `test`.`yhtest` trx id 3919 lock mode S waiting
Record lock, heap no 5 PHYSICAL RECORD: n_fields 2; compact format; info bits 32
0: len 4; hex 80000004; asc     ;;
1: len 4; hex 80000004; asc     ;;

*** WE ROLL BACK TRANSACTION (2)

通过innodb日志可以看出,

事物1执行  insert into yhtest value(2,2,2);  时,会等待b列索引b=3 上的S锁被添加,b=3 这一行因为被事物2执行了 delete from yhtest where a=3;  排他锁锁住, S锁等待正常。

事物2执行   insert into yhtest value(3,3,3); 时,可以看出其持有b=3 的X锁, 等待 b=4 上的S锁被添加,b=4 这一行 因为被事物1执行了delete from yhtest where a=4; 排他锁锁住,S锁等待, 这时候,事物1和事物2互相等待对方持有的锁资源,形成回环,死锁出现

这里事物1 插入(2,2,2) 和事物2插入(3,3,3) 因为b列的唯一键存在,需要进行唯一键校验,而由于在之前已经进行了该列删除,需要通过锁定下一列判断b=2 的唯一性,b=3的唯一性,而这两列的锁已经被对方持有,故出现死锁。

这种死锁情况,在RC隔离级别下同样会出现!

转载于:https://blog.51cto.com/11286233/1976765

mysql 死锁记录相关推荐

  1. mysql查询死锁的次数_一次神奇的MySQL死锁排查记录

    一次神奇的MySQL死锁排查记录 发布时间:2020-08-29 00:50:26 来源:脚本之家 阅读:135 作者:咖啡拿铁 背景 说起Mysql死锁,之前写过一次有关Mysql加锁的基本介绍,对 ...

  2. 记录一次mysql死锁

    一,死锁发现 项目中有一个接口包含更新操作1,后面发现更新失败,通过查看应用程序日志,发现发生了死锁 sql 1 如下 1.最初版本根据id为条件,更新(plan_start_time 二级索引) u ...

  3. java mysql死锁_记一次线上mysql死锁分析(一)

    记录一次比较诡异的mysql死锁日志.系统运行几个月来,就在前几天发生了一次死锁,而且就只发生了一次死锁,整个排查过程耗时将近一天,最后感谢我们的DBA大神和老大一起分析找到原因. 诊断死锁 借助于我 ...

  4. mysql死锁检测算法_MySQL 8 死锁检测脚本

    MySQL 8 记录死锁关的几张表有所变化,重新写一个脚本,便于在出现问题的时候快速处置问题. 死锁示意图 死锁相关的表 information_schema.INNODB_TRX `performa ...

  5. MySQL死锁如何处理

    转载自  MySQL死锁如何处理 前提 笔者负责的一个系统最近有新功能上线后突然在预警模块不定时报出MySQL死锁导致事务回滚.幸亏,上游系统采用了异步推送和同步查询结合的方式,感知到推送失败及时进行 ...

  6. mysql死锁的排查方法_MySQL死锁系列-线上死锁问题排查思路

    前言 MySQL 死锁异常是我们经常会遇到的线上异常类别,一旦线上业务日间复杂,各种业务操作之间往往会产生锁冲突,有些会导致死锁异常.这种死锁异常一般要在特定时间特定数据和特定业务操作才会复现,并且分 ...

  7. mysql死锁无法查询_MySQL死锁导致无法查询

    客服反馈后台无法查询,原因大概知道,是因为MySQL的事务产生了死锁,以往都不知道是哪个事务锁住了,只能很粗暴地重启MySQL 最近查找到一个方法,不用重启MySQL,记录如下 登录到MySQL,来看 ...

  8. go语言 mysql卡死_一次mysql死锁的排查过程-Go语言中文社区

    一次mysql死锁的排查过程一.背景17号晚上要吃饭了,看旁边的妹子和佐哥还在调代码,就问了下什么问题啊,还在弄,妹子说,在测试环境测试给用户并发发送卡券时,出现了死锁,但看代码没有死锁,问题如下图 ...

  9. zabbix监控mysql死锁

    percona MySQL Server Template算是比较常用的zabbix监控mysql的模板了,监控项也比较齐全,但是没有监控mysql死锁的监控项,如果有需求,就需要另外创建模板或者监控 ...

最新文章

  1. 轻量级的项目管理工具-Leangoo
  2. AngularJS自定义表单验证
  3. STL之Deque的使用方法
  4. Linux 用户组相关命令
  5. Linux Shell常用命令总结
  6. Axis通过wsdd部署Web Service
  7. SpringBoot开发Restful接口
  8. 详解数字电视机顶盒的功能技术与应用3
  9. 四川专科学校排名四川计算机,四川省现代计算机职业学院2020年排名
  10. Windows 2003安装IIS无法复制CONVLOG.EXECONVLOG.EX_问题
  11. 第三,四章 数据库和数据表的(增删改查,重命名等)基本操作
  12. Django 之 Session的简单使用
  13. 把txt格式数据制作成xml数据
  14. 学校计算机房的占地面积是78,国内哪所国际高中好,可以考取美国大学
  15. Blog从Hexo迁移至Wordpress
  16. linux挂在Windows操作系统共享文件夹
  17. JAVA回调函数简单讲解 CallBack
  18. [每日一氵]协方差矩阵计算
  19. LINK : fatal error LNK1181: 无法打开输入文件“xx.lib”(SpaHBridge.lib)
  20. UIkit框架之轮播特效

热门文章

  1. 为什么数据线easy糟糕
  2. 插件推荐(持续更新)
  3. OpenJudge/Poj 2001 Shortest Prefixes
  4. Free 4 months Serial License Key Of Outpost Security Suite Pro 8.1
  5. 设计模式系列-建造者模式
  6. 解密为什么八成IT人士愿意跳槽?
  7. 摩卡签约印尼五大运营商之一CSM,进军东南亚市场
  8. WebView宽度自适应
  9. 在x86上成功使用gentoo系统上安装的grub2启动 Mac OS X Leopard 10.5.7
  10. 比特币现金社区推出OP_RETURN的4字节前缀指南