回答
死锁指并发系统中不同线程间出现循环资源依赖,涉及的线程都在等待别的线程释放资源时,导致这几个线程都进入无限等待的状态。
在 MySQL 中,发生死锁,有两种解决策略:
- 锁等待超时。指线程直接进入等待,直到超时。可通过
innodb_lock_wait_timeout
参数设置超时时间,在 InnoDB 中,默认超时时间为 50S。 - 死锁检测。指 InnoDB 发起死锁检测,发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务能继续执行。可通过
innodb_deadlock_detect = on/off
开启关闭死锁检测,当然,对于高并发系统,开启死锁检测会降低整体性能。
扩展
死锁案例
1、默认情况下,InnoDB 只记录最后一次死锁信息,如需记录更多信息,可设置
SET GLOBAL innodb_print_all_deadlocks = ON;
。
2、开启两个会话模拟死锁