Skip to main content

开发过程中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;

删除数据时索引字段类型不匹配死锁