MySql锁等待问题的处理办法

建表

CREATE TABLE testdemo ( `id` int(255) NOT NULL , `c1` varchar(300) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL , `c2` int(50) NULL DEFAULT NULL , PRIMARY KEY (`id`), INDEX `idx_c2` (`c2`) USING BTREE )ENGINE=InnoDB;

insert into testdemo VALUES(1,'1',1),(2,'2',2);

使用一个会话打开并执行一个写锁

BEGIN
SELECT * FROM testdemo WHERE id = 1 FOR UPDATE

使用另一个会话框,上一个写锁

BEGIN
SELECT * FROM testdemo WHERE id = 1 lock in share mode

这时另一个会话执行会超时。如果发生在生产环境,可能会觉得纳闷,怎么老是等待超时呢?这时可使用下面语句找到问题的原因

select * from information_schema.INNODB_LOCKS;

这时发现同一张表有两个锁,一个是读锁一个是写锁
在这里插入图片描述
这时我们可以使用该语句找到进程号,并kill掉它就好

select * from sys.innodb_lock_waits

MySql锁等待问题的处理办法_第1张图片
执行下面命令即可解锁

KILL 7

你可能感兴趣的:(MySql)