mysql死锁日志阅读
前言
在开发中,我们经常会遇到死锁问题,我们会查看数据库的死锁日志来查看死锁出现的原因,但是死锁日志如果不会阅读的话,可能就导致我们难以进行问题的排查
环境介绍
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死锁日志阅读相关推荐
- 如何阅读MySQL死锁日志
现象描述 客户在夜间批量执行数据处理时发生了死锁现象,是由不同的会话并发删除数据引起的,这个问题原因是比较简单,但想通过这个案例让大家熟悉如何去排查死锁问题,如何去阅读死锁日志这才是目的.通过模拟用户 ...
- mysql 死锁日志_Mysql死锁以及死锁日志分析
死锁的概念 死锁:死锁一般是事务相互等待对方资源,***形成环路造成的. 对于死锁,数据库处理方法:牺牲一个连接,保证另外一个连接成功执行. 发生死锁会返回ERROR:1213 错误提示,大部分的死锁 ...
- MySQL死锁日志的查看和分析
目录 一,关于MySQL的死锁 二,人造一个死锁的场景 三,查看最近一次死锁的日志 四,死锁日志的内容 1,事务1信息 2,事务1持有的锁 3,事务1正在等待的锁 4,事务2信息 5,事务2正在持有的 ...
- java mysql死锁_记一次线上mysql死锁分析(一)
记录一次比较诡异的mysql死锁日志.系统运行几个月来,就在前几天发生了一次死锁,而且就只发生了一次死锁,整个排查过程耗时将近一天,最后感谢我们的DBA大神和老大一起分析找到原因. 诊断死锁 借助于我 ...
- 在线分析mysql死锁详解_记一次线上mysql死锁分析(一)
记录一次比较诡异的mysql死锁日志.系统运行几个月来,就在前几天发生了一次死锁,而且就只发生了一次死锁,整个排查过程耗时将近一天,最后感谢我们的DBA大神和老大一起分析找到原因. 诊断死锁 借助于我 ...
- 记录一次mysql死锁
一,死锁发现 项目中有一个接口包含更新操作1,后面发现更新失败,通过查看应用程序日志,发现发生了死锁 sql 1 如下 1.最初版本根据id为条件,更新(plan_start_time 二级索引) u ...
- MySQL如何阅读死锁日志
转载地址 http://blog.itpub.net/22664653/viewspace-2145133/ 我在这个文章的基础上进行了排版,添加了一些标题,让可读性更好 一 前言 欲善其事必先利其器 ...
- MySQL Innodb表导致死锁日志情况分析与归纳
案例描述 在定时脚本运行过程中,发现当备份表格的sql语句与删除该表部分数据的sql语句同时运行时,mysql会检测出死锁,并打印出日志. 两个sql语句如下: (1)insert into back ...
- 查看mysql数据库的死锁日志_【MySQL】mysql死锁以及死锁日志分析
1.死锁的概念 死锁:死锁一般是事务相互等待对方资源,最后形成环路造成的. 对于死锁,数据库处理方法:牺牲一个连接,保证另外一个连接成功执行. 发生死锁会返回ERROR:1213 错误提示,大部分的死 ...
最新文章
- 浅浅认识之VBS脚本访问接口与COMODO拦截COM接口
- linux系统版本间的区别是什么?内核又是什么
- 错误时自动退出bash shell脚本[重复]
- python 装饰器实现缓存_Python, 这一个缓存装饰器, 其执行流程是怎样的?
- verilog实现伺服电机控制
- λ演算的语法和语义_λ和副作用
- Linux中wait()函数及waitpid()函数
- 《大数据》第2期“应用”——医疗健康大数据:应用实例与系统分析
- 谁不在清了的飞鸽传书
- NLP 《分词方法》
- 在html5中能使用dom么,html5 – 如何在TypeScript中使用DOMStringMap?
- 当当购书双十一钜惠,5折封顶!附图灵人工智能书单
- 马斯克再带货狗狗币:超7成网友票选狗狗币为未来货币
- Redis Sentinel机制与用法说明【转】
- ToStringBuilder.reflectionToString
- MATLAB 爬取配色css数据及渐变图
- 五大主流云盘横评对比,百度、腾讯、115、iCloud、OneDrive哪家更值得付费?
- 理论计算机科学方向,计算机科学与技术专业考研方向:计算机软件与理论
- java做的桌面应用_把一个java web应用包装成桌面应用的简单做法
- Jupyter notebook更改字体