Mysql中的具体实现锁以及解决方案(详细)

2023-04-13 00:00:00 命令 线程 查看 进程 死锁

下面针对这篇博客加以补充:

在解决锁相关问题前先介绍几个常用命令;

(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_LOCKSINNODB_LOCK_WAITS这两个表

2:查看当前锁定的事务

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

3:查看当前等锁的事务

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

相关文章