前言

在开发中,我们经常会遇到死锁问题,我们会查看数据库的死锁日志来查看死锁出现的原因,但是死锁日志如果不会阅读的话,可能就导致我们难以进行问题的排查

环境介绍

1、数据库场景

MySQL 5.6 引擎为innodb 事务隔离级别为RR

CREATE TABLE `ty` (`id` int(11) NOT NULL AUTO_INCREMENT,`a` int(11) DEFAULT NULL,`b` int(11) DEFAULT NULL,PRIMARY KEY (`id`),KEY `idxa` (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4
insert into ty(a,b) values(2,3),(5,4),(6,7);

说明:一个ty表,主键id,自增,在a字段上加上一个普通索引

2、测试两事务并发

事务1:

  • 首先删除 a 为5的记录
  • 然后插入一条新记录

事务2:

  • 首先删除a为5的记录
  • 再次尝试删除a为5的记录,会出现死锁
T1 T2
begin;
delete from ty where a=5; begin;
delete from ty where a=5;
insert into ty(a,b) values(2,10);
delete from ty where a=5;ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

下面通过数据库的日志来进行分析:

3、日志分析

在数据库查看最近的死锁日志情况:

show engine innodb status

日志情况:

------------------------
LATEST DETECTED DEADLOCK
------------------------
2017-09-09 22:34:13 7f78eab82700
*** (1) TRANSACTION: #事务1
TRANSACTION 462308399, ACTIVE 33 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 360, 1 row lock(s)
MySQL thread id 3525577, OS thread handle 0x7f896cc4b700, query id 780039657 localhost root updating
delete from ty where a=5
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 219 page no 4 n bits 72 index `idxa` of table `test`.`ty` trx id 462308399 lock_mode X waiting*** (2) TRANSACTION: #事务2
TRANSACTION 462308398, ACTIVE 61 sec inserting, thread declared inside InnoDB 5000
mysql tables in use 1, locked 1
5 lock struct(s), heap size 1184, 4 row lock(s), undo log entries 2
MySQL thread id 3525490, OS thread handle 0x7f78eab82700, query id 780039714 localhost root update
insert into ty(a,b) values(2,10)
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 219 page no 4 n bits 72 index `idxa` of table `test`.`ty` trx id 462308398 lock_mode X
*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 219 page no 4 n bits 72 index `idxa` of table `test`.`ty` trx id 462308398 lock_mode X locks gap before rec insert intention waiting
*** WE ROLL BACK TRANSACTION (1)

日志字段分析介绍:

(1) TRANSACTION: #事务1

a、TRANSACTION 462308399, ACTIVE 33 sec starting index read
事务编号为 462308399 ,活跃33秒,starting index read 表示事务状态为根据索引读取数据。常见的其他状态:

  • fetching rows 表示事务状态在row_search_for_mysql中被设置,表示正在查找记录。
  • updating or deleting 表示事务已经真正进入了Update/delete的函数逻辑(row_update_for_mysql) thread
  • declared inside InnoDB 说明事务已经进入innodb层。通常而言 不在innodb层的事务大部分是会被回滚的。

b、mysql tables in use 1, locked 1

use 1 说明当前的事务使用一个表。

locked 1 表示表上有一个表锁,对于DML语句为LOCK_IX

c、LOCK WAIT 2 lock struct(s), heap size 360, 1 row lock(s)
LOCK WAIT表示正在等待锁

2 lock struct(s) 表示trx->trx_locks锁链表的长度为2,每个链表节点代表该事务持有的一个锁结构,包括表锁,记录锁以及auto_inc锁等。本案例中2locks 表示IX锁和 lock_mode X (Next-key lock)

heap size 360 表示事务分配的锁堆内存大小,一般没有什么具体的用处。

1 row lock(s)表示当前事务持有的行记录锁/gap 锁的个数。

d、delete from ty where a=5

表示事务1在执行的sql ,show engine innodb status 是查看不到完整的事务的sql 的,通常显示当前正在等待锁的sql。

e、 (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 219 page no 4 n bits 72 index idxa of table test.ty trx id 462308399 lock_mode X waiting

  • lock type : 锁的类型 这里指RECORD LOCKS(记录锁)
  • space id : 锁对象的space id
  • page no :事务锁定页的数量,若是表锁,该值为null
  • index :锁住的索引,这里指的是idxa索引
  • table:要加锁的表,这里是test数据库的ty表
  • trx id:事务id,这里是6FBF8
  • lock_mode : 锁的模式,这边指的是加了一个Next-Key lock

事务2的log 分析一样,

f、(2) HOLDS THE LOCK(S):
RECORD LOCKS space id 219 page no 4 n bits 72 index idxa of table test.ty trx id 462308398 lock_mode X

显示了事务2 insert into ty(a,b) values(2,10) 持有了a=5 的Lock mode X |LOCK_GAP ,不过我们从日志里面看不到 事务2 执行的 delete from ty where a=5;这点也是造成DBA 仅仅根据日志难以分析死锁的问题的根本原因。

e、(2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 219 page no 4 n bits 72 index idxa of table test.ty trx id 462308398 lock_mode X locks gap before rec insert intention waiting

表示事务2的insert 语句正在等待插入意向锁 lock_mode X locks gap before rec insert intention waiting (LOCK_X + LOCK_REC_GAP )

需要注意的是锁组合,类似lock_mode X waiting ,lock_mode X,lock_mode X locks gap before rec insert intention waiting 是我们分析死锁的核心重点

首先我们要知道对于MySQL有两种常规锁模式

LOCK_S(读锁,共享锁)

LOCK_X(写锁,排它锁)

最容易理解的锁模式,读加共享锁,写加排它锁.

有如下几种锁的属性

  • LOCK_REC_NOT_GAP (锁记录)
  • LOCK_GAP (锁记录前的GAP)
  • LOCK_ORDINARY (同时锁记录+记录前的GAP 。传说中的Next Key锁
  • LOCK_INSERT_INTENTION(插入意向锁,其实是特殊的GAP锁)

lock_mode介绍:

  • 单纯的record lock,显示的是:lock mode xx locks rec but not gap
  • 单纯的gap lock, 显示的是:lock mode xx locks gap before rec
  • 插入意向锁,显示的是lock_mode X locks gap before rec insert intention
  • 若是gap+record,也就是next key lock,显示的是:lock mode X <空>
  • waiting 表示锁等待

mysql死锁日志阅读相关推荐

  1. 如何阅读MySQL死锁日志

    现象描述 客户在夜间批量执行数据处理时发生了死锁现象,是由不同的会话并发删除数据引起的,这个问题原因是比较简单,但想通过这个案例让大家熟悉如何去排查死锁问题,如何去阅读死锁日志这才是目的.通过模拟用户 ...

  2. mysql 死锁日志_Mysql死锁以及死锁日志分析

    死锁的概念 死锁:死锁一般是事务相互等待对方资源,***形成环路造成的. 对于死锁,数据库处理方法:牺牲一个连接,保证另外一个连接成功执行. 发生死锁会返回ERROR:1213 错误提示,大部分的死锁 ...

  3. MySQL死锁日志的查看和分析

    目录 一,关于MySQL的死锁 二,人造一个死锁的场景 三,查看最近一次死锁的日志 四,死锁日志的内容 1,事务1信息 2,事务1持有的锁 3,事务1正在等待的锁 4,事务2信息 5,事务2正在持有的 ...

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

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

  5. 在线分析mysql死锁详解_记一次线上mysql死锁分析(一)

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

  6. 记录一次mysql死锁

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

  7. MySQL如何阅读死锁日志

    转载地址 http://blog.itpub.net/22664653/viewspace-2145133/ 我在这个文章的基础上进行了排版,添加了一些标题,让可读性更好 一 前言 欲善其事必先利其器 ...

  8. MySQL Innodb表导致死锁日志情况分析与归纳

    案例描述 在定时脚本运行过程中,发现当备份表格的sql语句与删除该表部分数据的sql语句同时运行时,mysql会检测出死锁,并打印出日志. 两个sql语句如下: (1)insert into back ...

  9. 查看mysql数据库的死锁日志_【MySQL】mysql死锁以及死锁日志分析

    1.死锁的概念 死锁:死锁一般是事务相互等待对方资源,最后形成环路造成的. 对于死锁,数据库处理方法:牺牲一个连接,保证另外一个连接成功执行. 发生死锁会返回ERROR:1213 错误提示,大部分的死 ...

最新文章

  1. 浅浅认识之VBS脚本访问接口与COMODO拦截COM接口
  2. linux系统版本间的区别是什么?内核又是什么
  3. 错误时自动退出bash shell脚本[重复]
  4. python 装饰器实现缓存_Python, 这一个缓存装饰器, 其执行流程是怎样的?
  5. verilog实现伺服电机控制
  6. λ演算的语法和语义_λ和副作用
  7. Linux中wait()函数及waitpid()函数
  8. 《大数据》第2期“应用”——医疗健康大数据:应用实例与系统分析
  9. 谁不在清了的飞鸽传书
  10. NLP 《分词方法》
  11. 在html5中能使用dom么,html5 – 如何在TypeScript中使用DOMStringMap?
  12. 当当购书双十一钜惠,5折封顶!附图灵人工智能书单
  13. 马斯克再带货狗狗币:超7成网友票选狗狗币为未来货币
  14. Redis Sentinel机制与用法说明【转】
  15. ToStringBuilder.reflectionToString
  16. MATLAB 爬取配色css数据及渐变图
  17. 五大主流云盘横评对比,百度、腾讯、115、iCloud、OneDrive哪家更值得付费?
  18. 理论计算机科学方向,计算机科学与技术专业考研方向:计算机软件与理论
  19. java做的桌面应用_把一个java web应用包装成桌面应用的简单做法
  20. Jupyter notebook更改字体

热门文章

  1. nginx简单创建ssl配置https,实现https静态访问图片和页面
  2. 使用ggplot2进行数据可视化(一)
  3. python生成pkl文件(pkl文件的读取和写入)
  4. 珊瑚海 - 一站式跨端动态化布局框架原理
  5. Shiro一处登录与退出
  6. 学校里的流浪狗,该咋整
  7. 如何成为一名黑客(转)
  8. Vue中遇到无法加载文件的问题,在系统上禁止运行脚本
  9. 写伪代码的一些注意事项
  10. faster-rcnn 之 RPN网络的结构解析