记一次 MySQL 死锁解决过程

代码中要执行一个 SQL 语句,去更新表数据,这个 SQL 并没有在一个事务中,但是每次都会报错:Lock wait timeout exceeded; try restarting transaction。由于这个更新语句不在事务中,所以我怀疑要更新的表因为某些原因一直是被锁住的状态。

找到了这篇博客,使用 SELECT * FROM information_schema.INNODB_TRX 查看事务,发现有五个 trx_stateRunning 的事务,于是再使用 show processlist 查看线程,发现五个事务全部在 show preprocesslist 里面的 sleep 线程中,kill 掉这五个线程,再次执行 SQL 时没有发生死锁。