MySQL 8.4 发行说明
以下各项描述了 InnoDB 如何执行错误处理。InnoDB 有时只回滚失败的语句,有时则回滚整个事务。
如果 表空间 中的空间不足,则会出现 MySQL
表已满错误,并且InnoDB会回滚 SQL 语句。事务 死锁 会导致
InnoDB回滚 整个 事务。发生这种情况时,请重试整个事务。锁等待超时会导致
InnoDB回滚当前语句(等待锁并遇到超时的语句)。要回滚整个事务,请在启用--innodb-rollback-on-timeout的情况下启动服务器。如果使用默认行为,则重试该语句,如果启用了--innodb-rollback-on-timeout,则重试整个事务。死锁和锁等待超时在繁忙的服务器上都是正常的,应用程序必须意识到它们可能会发生,并通过重试来处理它们。您可以通过在事务期间对数据的第一次更改和提交之间尽可能少地工作来降低它们发生的可能性,这样锁就会在尽可能短的时间内和尽可能少的行上保持。有时,在不同的事务之间拆分工作可能是切实可行的,并且会有所帮助。
如果您没有在语句中指定
IGNORE选项,则重复键错误会回滚 SQL 语句。行过长错误会回滚 SQL 语句。其他错误主要由 MySQL 代码层(
InnoDB存储引擎级别以上)检测到,它们会回滚相应的 SQL 语句。锁不会在单个 SQL 语句的回滚中释放。
在隐式回滚期间,以及在执行显式 ROLLBACK SQL 语句期间,SHOW PROCESSLIST 会在相关连接的 状态 列中显示 正在回滚。