admin

Lock wait timeout exceeded; try restarting transaction问题解析及解决方案

admin 数据库 2024-07-19 254022浏览 0

MySQL数据库:Lock wait timeout exceeded; try restarting transaction问题解析及解决方案

解决方案

可以使用 information_schema 查询数据库使用情况。information_schema 这个数据库保存了 MySQL 服务器所有数据库的信息。


如数据库名,数据库的表,表栏的数据类型与访问权限等。也就是说,这台 MySQL 服务器上,到底有哪些数据库、各个数据库有哪些表,每张表的字段类型是什么,各个数据库要什么权限才能访问等等信息都保存在 information_schema 库里面。


1、SELECT * FROM information_schema.INNODB_TRX; – 当前运行的所有事务

2、SELECT * FROM information_schema.INNODB_LOCKS; – 当前出现的锁

3、SELECT * FROM information_schema.INNODB_LOCK_WAITS; – 锁等待的对应关系


3.1 方案一 事务信息查询

通过SELECT * FROM information_schema.innodb_trx查询未提交事务,查到一个一直没有提交的只读事务(trx_state=”LOCK WAIT”),找到对应线程,执行:kill 线程ID。线程id为表中的trx_mysql_thread_id字段。


如果数据库中有锁的话,查看 innodb_trx就可以看到对应的信息。通过查询知道是哪条语句锁了,图中红色语句为占用系统资源的语句,我们需要杀掉这个锁,执行 kill 线程id号

解决方法

MySQL的information_schema数据库中有一张名为INNODB_LOCKS的表,其中记录了当前被锁住的事务信息。我们可以通过查询该表,找到被锁住的线程并使用kill命令将其终止。

KILL <thread_id>;


步骤1:查询被锁住的线程

SELECT * FROM information_schema.INNODB_LOCKS;

执行以上查询语句,将返回被锁住的线程的相关信息,包括线程ID和锁住的表。


步骤2:使用kill命令解锁线程

KILL <thread_id>;

将<thread_id>替换为被锁住的线程ID,执行该命令即可终止该线程。


示例

假设我们有一个表orders,由于一个长时间运行的查询导致该表被锁住。我们可以按照以下步骤解锁该表:

执行以下查询语句,查找被锁住的线程:

SELECT * FROM information_schema.INNODB_LOCKS WHERE table_name = 'orders';

此时,我们会得到被锁住的线程ID。


使用kill命令终止该线程:

KILL <thread_id>;

1.

将<thread_id>替换为查询到的线程ID。


总结

通过查询INNODB_LOCKS表并使用kill命令,我们可以解锁MySQL中被锁住的表,以便其他用户可以正常地对其进行操作。在开发过程中,当遇到表被锁住的情况时,可以使用该方法来解决问题。


版权声明

本站《作品展示》类文章均为原创,转载必须注明出处,技术分享类文章部分来源于网络,版权归原作者所有,若侵权请留言。