开发过程中mysql死锁排查汇总
About 2 min
开发过程中mysql死锁排查汇总
在开发过程中,一旦出现并发问题,那么很可能会产生死锁或者锁等待超时。如果生产环境出现这类问题,那么后果不开设想。
笔者在这里将遇到的一些死锁情况做个汇总记录,方便以后遇到同类问题时可以迅速解决或提供解决思路。
排查死锁常用命令
-- 该命令会返回当前InnoDB引擎的状态信息,其中包含了当前正在等待或者拥有的锁以及被阻塞的事务等信息。
SHOW ENGINE INNODB STATUS;
-- 该命令可以列出当前所有正在运行的进程,包括它们的状态、执行时间、所属用户等信息。
SHOW FULL PROCESSLIST;
-- 该命令可以列出当前所有活跃的事务,包括它们的ID、状态、开始时间等信息。
SELECT * FROM information_schema.innodb_trx;
-- 该命令可以列出当前所有被锁定的对象,包括锁的类型、锁定者、被锁定的表和行等信息。
SELECT * FROM information_schema.innodb_locks;
-- 该命令可以列出当前所有的等待锁的情况,包括请求锁的事务、被请求的锁的类型和状态等信息。
SELECT * FROM information_schema.innodb_lock_waits;
表字段没有加索引导致死锁
操作一张表的时候,如果查询条件里没有加上索引,mysql 会做全表扫描,在并发环境下,如果有更新操作,那么就会产生
大批量数据 in 更新死锁
造数据
CREATE TABLE `t2`
(
`id` int NOT NULL,
`c` int DEFAULT NULL,
`d` int DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `c` (`c`)
) ENGINE=InnoDB;
drop procedure createData;
create procedure createData()
begin
declare i int default 0;
label:
while(i < 100000)
do
insert into t2(id, c, d) values (i, i, i);
set i = i + 1;
end while label;
end;
call createData()