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