天天看点

一次mysql事务锁问题记录

现象:

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语句,一定要进行组内确认哈,避免影响其他业务