今天在删除表格的时候出现如下报错:

于是通过查询当前线程发现有多个线程同时开启运行中。。。

查看当前运行的所有事务

SELECT * FROM information_schema.INNODB_TRX;


可以发现有三个事务同时都在运行。。。所以可以找到掌柜这里报错的直接原因是:
之前存储过程(里面开启了事务)运行半天没有反应就手动关闭了MySQL。。。没有让它进行commit。。。并且之后在同一事务再对数据进行删除操作就造成了事务锁。。。

而根本原因是MySQL默认使用的是Innodb引擎,而Innodb的默认参数: innodb_lock_wait_timeout,设置了事务等待获取资源的最长时间(默认50s),一旦超过了这个最长时间还没得到资源就会报错如题。

好了,既然报错原因找到了,那么解决的办法也有了,这里有三种解决的办法

  • 找到当前事务的线程,kill该线程;
  • 扩大该参数:innodb_lock_wait_timeout 的等待时间;
  • 优化存储过程。

这里掌柜采用的是第一种方法,kill掉多余的线程后再次查看当前运行的所有事务

发现奇怪的事?怎么刚刚killed的10号线程还在???它当前的状态是 ROLLING BACK,看这意思是刚才被 killed 的事务一直处于回滚状态。于是掌柜继续查阅资料发现,之所以会出现这样的情况 是因为kill命令虽然触发了,但是要终止这个kill逻辑耗时较长,也受IO资源的影响,所以才会出现虽然killed执行了,但是发生回滚的情况

解决办法

  • 一种是等它自我回滚结束
  • 另一种就是重启MySQL,但是重启MySQL,事务还是会进行回滚,所以其实总的来说就是等它回滚结束即可😂!


等了大概七八分钟后就全部清空,所有事务也都结束了:

然后再次执行删除操作就OK了:

参考资料:
MySQL事务锁问题
MySQL事务锁等待超时
为什么有kill不掉的语句?