前言
本文主要解决当出现异常情况导致数据库某些锁出现死锁的情况,强制手动处理死锁的情况
关闭死锁
1、首先我们先使用navicat工具打开两个查询窗口,分别执行以下语句
begin;
SELECT * FROM `test` where id = 1 for update;
开启事务,然后使用排它锁锁住id为1的数据,此时第二个客户端会进入等待状态,模拟出一个锁等待的场景
2、执行以下sql,查询当前等待锁的情况
select * from information_schema.INNODB_LOCK_WAITS;
可见事务id为18632的事务在等待事务id为18625的事务
3、再执行以下查看事务的情况
select * from information_schema.INNODB_TRX;
可见事务id为18625的线程id为353
4、手动杀死该线程
kill 353
可以看到第二个查询窗口执行结束了,第一个窗口的事务被关闭了
另外还有以下指令可用
-- 查看当前锁的情况,Innodb_row_lock_current_waits当前等待的锁
show status like 'innodb_row_lock_%';
-- 可以查看当前有多少锁
select * from information_schema.INNODB_LOCKS;
-- 1、查找当前锁等待的事务id(blocking_trx_id)
select * from information_schema.INNODB_LOCK_WAITS;
-- 2、找到对应的事务id对应的线程id(trx_mysql_thread_id)
select * from information_schema.INNODB_TRX;
-- 3、kill线程id,关闭该事务
kill pid;