Yassine LD Asked: 2020-11-05 10:11:29 +0800 CST2020-11-05 10:11:29 +0800 CST 2020-11-05 10:11:29 +0800 CST 当表被锁定但 SHOW PROCESSLIST 不显示任何内容时 772 我们的应用程序有些缓慢。当我检查时,我发现一个特定的表被锁定,所以所有事务都被拒绝了Lock wait timeout exceeded。当我这样做时,SHOW PROCESSLIST;我希望看到一些带有Waiting for table level lock状态的进程,但它什么也没显示!?只有在同一张表上的一些查询 INSERT/UPDATE 在超时前恰好需要 120 秒,而其他进程则处于睡眠状态(见图): innodb mariadb 1 个回答 Voted Best Answer Yassine LD 2020-11-05T10:11:29+08:002020-11-05T10:11:29+08:00 在我的情况下,原因是一个事务正在对导致“ Lock wait timeout exceeded”的特定表进行读锁,因为它没有提交。所以所有其他事务都在等待那个特定的 tranx 提交。 现在,为什么SHOW PROCESSLIST;什么都不显示?事实上,确实如此。你会发现它(进程)处于“睡眠”状态,并且在信息列中没有显示任何查询,就像它只是与数据库的常规连接一样。 让我们在图片中查看我的示例: 在蓝色中,这些是一些非常简单的查询被阻塞(在超时前需要 120 秒),红色是“幽灵”或未提交的事务。 要查看此类事务的执行: SELECT TRX_ID, TRX_REQUESTED_LOCK_ID, TRX_MYSQL_THREAD_ID, TRX_QUERY FROM INNODB_TRX 并且您可以终止为空的进程以释放其他事务kill <id>;。TRX_QUERY就我而言,KILL 33267342; 确保检查未提交的事务以查看是否缺少一个commit;或一个Rollback子句,以避免此类问题。
在我的情况下,原因是一个事务正在对导致“
Lock wait timeout exceeded
”的特定表进行读锁,因为它没有提交。所以所有其他事务都在等待那个特定的 tranx 提交。现在,为什么
SHOW PROCESSLIST;
什么都不显示?事实上,确实如此。你会发现它(进程)处于“睡眠”状态,并且在信息列中没有显示任何查询,就像它只是与数据库的常规连接一样。让我们在图片中查看我的示例:
在蓝色中,这些是一些非常简单的查询被阻塞(在超时前需要 120 秒),红色是“幽灵”或未提交的事务。
要查看此类事务的执行:
并且您可以终止为空的进程以释放其他事务
kill <id>;
。TRX_QUERY
就我而言,KILL 33267342;
确保检查未提交的事务以查看是否缺少一个
commit;
或一个Rollback
子句,以避免此类问题。