现象: Lock wait timeout exceeded; try restarting transaction
场景:在不同服务器不同事务内先后对同一个数据表进行插入、更新,数据库出现被锁情况
原因:mysql数据库采用InnoDB模式,默认参数 innodb_lock_wait_timeout 设置锁等待时间是50s,一旦数据库锁超过这个时间就会报错
解决方法:
1、查看数据库当前的进程,看一下是否有正在执行的慢SQL记录线程
show processlist;
2、查看当前的事务
当前运行的所有事务
SELECT * FROM information_schema.INNODB_TRX;
当前出现的锁
SELECT * FROM information_schema.INNODB_LOCKs;
锁等待的对应关系
SELECT * FROM information_schema.INNODB_LOCK_waits;
解释:查看事务表INNODB_TRX,里面是否有正在lock wait锁定的事务线程,查看ID是否在show processlist里面的sleep线程中,如果是,证明这个sleep线程事务一直没有commit或者rollback,而是卡住了,需手动kill掉,若要kill语句,一定要进行组内确认哈,避免影响其他业务