在后台代码中书写的一个更新操作中,前端长时间没有得到响应,后来刷新前端页面后再次提交也是无法成功,后来就根据
后台日志信息,结果卡在了update一个表数据上,抛出了,等待锁超时尝试重启事务
Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException:
Lock wait timeout exceeded; try restarting transaction
### 首先登陆mysql shell
$ mysql -u root -h 127.0.0.1 -p
$密码输入
### 查看mysql中现在执行的 所有线程
mysql>show processlist;
线程id 登陆用户 主机 数据库名称 指令 时间
### kill 掉 指定的第一列线程id
mysql>kill thread_id;
#### 可以编写shell脚本执行如下
#!/bin/bash
mysql -u root -e "show processlist" | grep -i "Locked" >> locked_log.txt
for line in `cat locked_log.txt | awk '{print $1}'`
do
echo "kill $line;" >> kill_thread_id.sql
done
现在kill_thread_id.sql的内容像这个样子
kill 66402982;
kill 66402983;
kill 66402986;
kill 66402991;
.....
好了, 我们在mysql的shell中执行, 就可以把所有锁表的进程杀死了.
mysql>source kill_thread_id.sql
当然了, 也可以一行搞定
for id in `mysqladmin processlist | grep -i locked | awk '{print $1}'`
do
mysqladmin kill ${id}
done
-----------------------------------------------------------------------------------------------------------------------------------
navcat下操作
现在我们要查test库中使用情况,我们可以到information_schema中查询
解释:information_schema这张数据表保存了MySQL服务器所有数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。再简单点,这台MySQL服务器上,到底有哪些数据库、各个数据库有哪些表,每张表的字段类型是什么,各个数据库要什么权限才能访问,等等信息都保存在information_schema表里面。
我们可以用下面三张表来查原因:
innodb_trx ## 当前运行的所有事务
innodb_locks ## 当前出现的锁
innodb_lock_waits ## 锁等待的对应关系
此时我们在navcat中操作如下的指令,就会看到所有先执行事务的语句操作,
然后我们找到状态 trx_state 被锁的状态,然后使用kill命令干掉它就可以
-- 查看 所有mysql 进程id
show full PROCESSLIST;
-- 查看mysql 事务处理列表
select * from information_schema.INNODB_TRX
kill 14237
这里会涉及到三种表