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中被锁住的表,以便其他用户可以正常地对其进行操作。在开发过程中,当遇到表被锁住的情况时,可以使用该方法来解决问题。
版权声明
本站《作品展示》类文章均为原创,转载必须注明出处,技术分享类文章部分来源于网络,版权归原作者所有,若侵权请留言。