MySQL 解决死锁

模拟死锁 - 第一步(创建表,并插入数据)

1
2
3
4
5
6
7
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(16) COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

INSERT INTO test(title) VALUES('A'),('B');

模拟死锁 - 第二步(会话一:开启事务,更新不提交)

1
2
begin;
UPDATE test SET title = 'C' WHERE id = 1;

模拟死锁 - 第三步(会话二:开启事务,更新同一条数据)

经过一段时间后,提示 Lock wait timeout exceeded; try restarting transaction

1
UPDATE test SET title = 'D' WHERE id = 1;

解决方法

1
2
3
4
#查看未提交的事务,trx_mysql_thread_id 为线程ID,比如查询出来的 trx_mysql_thread_id = 853
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
#执行 kill 线程ID
KILL 853

相关命令

1
2
3
4
5
6
#显示哪些线程正在运行
SHOW PROCESSLIST;
#查看当前锁定的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
#查看当前等待的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

0%