2024-11-09
版权声明:本文为博主付费文章,严禁任何形式的转载和摘抄,维权必究。 本文链接:https://www.skjava.com/mianshi/baodian/detail/1476875763

回答

死锁指并发系统中不同线程间出现循环资源依赖,涉及的线程都在等待别的线程释放资源时,导致这几个线程都进入无限等待的状态。

在 MySQL 中,发生死锁,有两种解决策略:

  • 锁等待超时。指线程直接进入等待,直到超时。可通过innodb_lock_wait_timeout参数设置超时时间,在 InnoDB 中,默认超时时间为 50S。
  • 死锁检测。指 InnoDB 发起死锁检测,发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务能继续执行。可通过innodb_deadlock_detect = on/off开启关闭死锁检测,当然,对于高并发系统,开启死锁检测会降低整体性能。

扩展

死锁案例

1、默认情况下,InnoDB 只记录最后一次死锁信息,如需记录更多信息,可设置

SET GLOBAL innodb_print_all_deadlocks = ON;

2、开启两个会话模拟死锁