#### 15.7.5.2 死锁检测

[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)

什么时候[死锁检测](glossary.html#glos_deadlock_detection)已启用（默认），`InnoDB`自动检测交易[死锁](glossary.html#glos_deadlock)并回滚一个或多个事务以打破死锁。`InnoDB`尝试选择要回滚的小事务，其中事务的大小由插入、更新或删除的行数决定。

`InnoDB`知道表锁，如果`innodb_table_locks = 1`（默认）和[`自动提交 = 0`](server-system-variables.html#sysvar_autocommit)，并且它上面的 MySQL 层知道行级锁。否则，`InnoDB`无法检测到由 MySQL 设置的表锁的死锁[`锁定表`](lock-tables.html)语句或由存储引擎设置的锁，而不是`InnoDB`参与。通过设置的值来解决这些情况[`innodb_lock_wait_timeout`](innodb-parameters.html#sysvar_innodb_lock_wait_timeout)系统变量。

如果`最新检测到的死锁`部分`InnoDB`监视器输出包括一条消息，指出在锁定表等待图表中搜索过深或过长，我们将在事务后回滚，这表明等待列表上的事务数已达到 200 的限制。等待 -超过 200 个事务的 for 列表将被视为死锁，并且尝试检查等待列表的事务将回滚。如果锁定线程必须查看等待列表上的事务拥有的超过 1,000,000 个锁，也可能会发生相同的错误。

有关组织数据库操作以避免死锁的技术，请参阅[第 15.7.5 节，“InnoDB 中的死锁”](innodb-deadlocks.html).

##### 禁用死锁检测

在高并发系统上，当多个线程等待同一个锁时，死锁检测会导致速度变慢。有时，禁用死锁检测并依赖[`innodb_lock_wait_timeout`](innodb-parameters.html#sysvar_innodb_lock_wait_timeout)发生死锁时事务回滚的设置。死锁检测可以使用禁用[`innodb_deadlock_detect`](innodb-parameters.html#sysvar_innodb_deadlock_detect)多变的。
