天老爷,mysql死锁居然让我给遇上了!!!
场景复现:
我本地IDEA连接了测试环境的mysql,然后调一个需要事务的接口,断点打到一半。然后测试环境又调同一个接口拿到同一个事务。这个时候就抛异常
思考:所以两个进程去同一个事务处理,但是业务代码又不是同步的,且前一个去事务的进程还没有释放锁,就抛了这个异常。
确认问题:去数据库执行这个语句,有两个事务
SELECT * FROM information_schema.INNODB_TRX;
解决问题:
1 释放本地造成的事务锁:我把本地IDEA的断点释放了,还有有异常,于是,我把本地服务关了,这个时候再执行上面的语句只有一个事务了。
2 释放测试环境造成的锁:测试环境是用Jenkins+docker部署的,我执行了Jenkins的build,再去用上面的语句查数据库,还是存在。于是用下面语句查询出来,并执行查询出的语句去kill。
SELECT concat('KILL ',id,';') FROM information_schema.processlist p INNER JOIN information_schema.INNODB_TRX x ON p.id=x.trx_mysql_thread_id WHERE db='数据库名';
成功处理了问题