今天在删除表格的时候出现如下报错:
于是通过查询当前线程发现有多个线程同时开启运行中。。。
再查看当前运行的所有事务:
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了: