死锁分段信息解读

本文详细解析了MySQL InnoDB引擎在遇到死锁时的监控输出,包括事务信息、持有和等待的锁信息,以及如何通过这些信息定位死锁原因。在示例中,两个事务因并发更新相同数据行导致死锁,最终其中一个事务被回滚以解决死锁。
摘要由CSDN通过智能技术生成

服务器发生了死锁的情况时,这部分会显示出来。死锁通常的原因很复杂,但是这一部分只会显示最后两个发生死锁的事务,尽管可能也有其它事务也包含在死锁过程中。不过,尽管信息被删减了,通常也能够通过这些信息找出死锁的原因。

SELECT … FOR SHARE设置一个IS锁,然后 SELECT … FOR UPDATE设置一个IX锁。

表级锁类型兼容性总结在以下矩阵中。

- X IX S IS
X 冲突 冲突 冲突 冲突
IX 冲突 兼容的 冲突 兼容的
S 冲突 冲突 兼容的 兼容的
IS 冲突 兼容的 兼容的 兼容的

先介绍InnoDB 记录存储结构

在这里插入图片描述

这是一条记录以compact形式保存时候的存储结构。

变长字段长度列表:类似varchar,会存储在这里面,并以倒叙的顺序。
NULL值列表:某些列存储的是null值,则这个列表会存储
记录头信息:

在这里插入图片描述

heap_no:表示当前记录在记录堆起的位置信息。表示在页中的位置,从0开始,但是普通记录的heap_no 2开始,其中 0是最小记录,1是最大记录。
record_type:
2表示最小记录,就是heap_no 是0的,同时数据表示的是infimum。
3表示最大记录,就是heap_no是1的,同时数据表示的是supremum。
next_record:这个指向的就是向下一条记录,以链式的方式存储。

更多存储的格式可以参考

https://blog.csdn.net/xmzyjr123/article/details/86694010

下面来举个例子解析

GreatDB Cluster[(none)]> show engine innodb status \G
*************************** 1. row ***************************
  Type: InnoDB
  Name: 
Status: 
=====================================
2021-10-28 09:29:07 139894432659200 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 56 seconds
-----------------
BACKGROUND THREAD
-----------------
srv_master_thread loops: 1143 srv_active, 0 srv_shutdown, 56850 srv_idle
srv_master_thread log flush and writes: 0
----------
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count 33361
OS WAIT ARRAY INFO: signal count 40690
RW-shared spins 0, rounds 0, OS waits 0
RW-excl spins 0, rounds 0, OS waits 0
RW-sx spins 0, rounds 0, OS waits 0
Spin rounds per wait: 0.00 RW-shared, 0.00 RW-excl, 0.00 RW-sx
------------------------
LATEST DETECTED DEADLOCK
------------------------
2021-10-28 09:20:48 139895670548224
--第一个事物的信息
*** (1) TRANSACTION:  
--事务1254799,活跃了0秒,starting index read表示正在使用索引读取数据行
TRANSACTION 1254799, ACTIVE 0 sec starting index read
mysql tables in use 1, locked 1
--等待5把锁,占用内存1136字节,涉及3行记录
--5 lock struct(s) 表示该事务的锁链表的长度为 5,每个链表节点代表该事务持有的一个锁结构,包括表锁,记录锁以及 autoinc 锁等。heap size 1136 为事务分配的锁堆内存大小。3 row lock(s) 表示当前事务持有的行锁个数,通过遍历上面提到的 5 个锁结构,找出其中类型为 LOCK_REC 的记录数。undo log entries 1 表示当前事务有 1 个 undo log 记录,因为二级索引不记 undo log,说明该事务已经更新了 15 条聚集索引记录。
LOCK WAIT 5 lock struct(s), heap size 1136, 3 row lock(s), undo log entries 1
--这行表示该事务的线程ID信息,操作系统句柄信息,连接来源、用户
MySQL thread id 220, OS thread handle 139895127729920, query id 12188056 172.17.0.7 greatdb statistics
--涉及的sql
SELECT `id`, `_hidden_pk_
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值