下面针对这篇博客加以补充:
在解决锁相关问题前先介绍几个常用命令;
(1)show processlist 命令
如果您有SUPER权限,您可以看到所有线程。否则,您只能看到您自己的线程,所以使用root用户可以解锁其他账户
- id #ID标识,要kill一个语句的时候很有用
- use #当前连接用户
- host #显示这个连接从哪个ip的哪个端口上发出
- db #数据库名
- command #连接状态,一般是休眠(sleep),查询(query),连接(connect)
- time #连接持续时间,单位是秒
- state #显示当前sql语句的状态
- info #显示这个sql语句
(2)kill id 命令
杀死某个进程,可以解决死锁卡死的问题
可以看到,进程id为30的进程在等待锁,执行命令kill 30
另一个一直等待着的窗口:
(3)show OPEN TABLES where In_use > 0 命令
查询是否锁表,In_use列表示有多少线程正在使用某张表,Name_locked表示表名是否被锁
(4)查看autocommit状态以及设置:
show variables like 'autocommit';
解除死锁的方式:
种:
1.查询是否锁表
show OPEN TABLES where In_use > 0;
2.查询进程
show processlist
3.杀死进程id(就是上面命令的id列)
kill id
第二种:
1.查看下在锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
2.杀死进程id(就是上面命令的trx_mysql_thread_id列)
kill 线程ID
例子
查出死锁进程:SHOW PROCESSLIST
杀掉进程 KILL 420821;
其它关于查看死锁的命令:
1:查看当前的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
但是下面两个语句我在mysql 8.0.13中发现informationschema数据下没有INNODB_LOCKS,INNODB_LOCK_WAITS这两个表
2:查看当前锁定的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
3:查看当前等锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;