记一次莫名其妙的报错与解决:Waiting for table metadata lock;
报错步骤:
程序执行时突然报错
Lock wait timeout exceeded; try restarting transaction
Error updating database. Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactio
解决步骤:
-- 查看当前运行的所有事务:
select * from information_schema.innodb_trx;
-- 查看当前对应的MySQL帐户运行的线程:
-- 报错时state显示Waiting for table metadata lock;
-- 此时随便发起一个查询或修改都会报错;
show processlist;
-- 杀掉指定线程
KILL 33862493;
-- 通过show processlist看不到TableA上有任何操作,在information_schema.innodb_trx中也没有任何进行中的事务。
-- 这很可能是因为在一个显式的事务中,对TableA进行了一个失败的操作(比如查询了一个不存在的字段),这时事务没有开始,但是失败语句获取到的锁依然有效,没有释放。
-- 从performance_schema.events_statements_current表中可以查到失败的语句。
select * from performance_schema.events_statements_current;
-- 一次性找到所有未完成的进行,并通过sql语句将其全部找到,然后统一杀死(万不得已,不建议这么做,基本就等于宁错杀一千也不放过一个)
select concat('kill ',trx_mysql_thread_id,';') as kill_id from information_schema.INNODB_TRX
where trx_lock_structs=0 and trx_weight=0 and trx_rows_locked=0
and trx_rows_modified=0 and trx_state='RUNNING';
-- 查看未提交事务
-- 杀掉这个线程,问题解决(懵)
select trx_state, trx_started, trx_mysql_thread_id, trx_query from information_schema.innodb_trx;