### 15.21.5 InnoDB 错误处理

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

以下项目描述了如何`InnoDB`执行错误处理。`InnoDB`有时只回滚失败的语句，有时它会回滚整个事务。

-   如果您的文件空间不足[表空间](glossary.html#glos_tablespace), 一个 MySQL`表已满`发生错误并且`InnoDB`回滚 SQL 语句。

-   一笔交易[僵局](glossary.html#glos_deadlock)原因`InnoDB`到[回滚](glossary.html#glos_rollback)整个[交易](glossary.html#glos_transaction).发生这种情况时重试整个事务。

    锁定等待超时导致`InnoDB`回滚当前语句（等待锁定并遇到超时的语句）。要让整个事务回滚，请使用以下命令启动服务器[`--innodb-rollback-on-timeout`](innodb-parameters.html#sysvar_innodb_rollback_on_timeout)启用。如果使用默认行为，则重试该语句，如果使用默认行为，则重试整个事务[`--innodb-rollback-on-timeout`](innodb-parameters.html#sysvar_innodb_rollback_on_timeout)已启用。

    在繁忙的服务器上，死锁和锁等待超时都是正常的，应用程序必须意识到它们可能会发生并通过重试来处理它们。您可以通过在事务期间对数据的第一次更改和提交之间做尽可能少的工作来降低它们的可能性，从而使锁定保持尽可能短的时间和尽可能少的行数。有时在不同事务之间拆分工作可能是实用且有帮助的。

-   如果您未指定重复键错误，则回滚 SQL 语句`忽视`您的陈述中的选项。

-   一种`行太长错误`回滚 SQL 语句。

-   其他错误大多是由 MySQL 代码层检测到的（以上`InnoDB`存储引擎级别），并回滚相应的 SQL 语句。锁不会在单个 SQL 语句的回滚中释放。

    在隐式回滚期间，以及在显式执行期间[`回滚`](commit.html)SQL 语句，[`显示进程列表`](show-processlist.html)显示`滚回来`在里面`状态`相关连接的列。
