在这种情况下,由于互相等待对方释放锁,线程就会进入一个循环等待(loop wait)状态,也就是无限循环尝试获取锁。这样的话,如果没有外部干预,线程们就会一直卡住无法执行其他任务,直到出现超时或者手动中断为止。
看起来这个问题很麻烦,但实际上大家可以通过一些手段来解决。一个常见的解决方案就是优化表结构和索引,减少不必要的锁等待。除此之外,大家还可以通过设置参数来调整MySQL的行为,使之更适合大家的需求。
# 以下是三种调整参数的方法 # 1. 针对当前事务临时调整 SET innodb_lock_wait_timeout=10; -- 将锁等待超时时间设置为10秒 # 2. 全局设置,修改配置文件 [mysqld] innodb_lock_wait_timeout=10 # 3. 针对当前连接临时调整 mysql -u root -p --connect-expired-password SET GLOBAL innodb_lock_wait_timeout=10;
需要注意的是,调整参数只能解决一时的问题,并不能消灭“loop wait”现象。真正的解决方案还是优化表结构和索引,避免锁等待的情况出现。