14.22.4 InnoDB 错误处理

以下各项描述InnoDB如何执行错误处理。 InnoDB有时仅回滚失败的语句,而其他时候回滚整个事务。

  • 如果tablespace中的文件空间用完,则会发生 MySQL Table is full错误,并且InnoDB回滚 SQL 语句。

  • 事务deadlock使InnoDB roll back整个transaction。发生这种情况时,请重试整个事务。

锁定 await 超时导致InnoDB仅回滚正在 await 锁定且遇到超时的单个语句。 (要使整个事务回滚,请使用--innodb-rollback-on-timeout选项启动服务器。)如果使用当前行为,请重试该语句;如果使用--innodb-rollback-on-timeout,请重试该事务。

死锁和锁定 await 超时在繁忙的服务器上都是正常的,应用程序必须意识到它们可能发生并通过重试来处理它们。您可以通过在事务期间第一次更改数据和提交之间进行尽可能少的工作来减少它们的可能性,因此将锁保持在最短的时间内,并且行的数量最少。有时,在不同 Transaction 之间分配工作可能是实用且有用的。

当由于死锁或锁定 await 超时而导致事务回滚时,它将取消事务中语句的影响。但是,如果 start-transaction 语句是START TRANSACTIONBEGIN语句,则回滚不会取消该语句。直到出现COMMITROLLBACK或导致隐式提交的某些 SQL 语句,其他 SQL 语句才成为事务的一部分。

  • 如果未在语句中指定IGNORE选项,则重复键错误将回滚 SQL 语句。

  • row too long error会回滚 SQL 语句。

  • 其他错误大多数由 MySQL 代码层(在InnoDB存储引擎级别之上)检测到,并且它们回滚相应的 SQL 语句。在单个 SQL 语句的回滚中不会释放锁。

在隐式回滚期间以及在执行显式ROLLBACK SQL 语句期间,SHOW PROCESSLISTState列中为相关连接显示Rolling back