InnoDB 的出错处理不总是与 ANSI SQL 指定的一致。依照 ANSI 标准,在一个 SQL 语句中的任何错误都将引起这条语句的回滚。InnoDB 有时只回滚语句的一部分,有时则是整个事务。 下面的列表详细说明了 InnoDB 的出错处理。
如果用完了表空间内的文件空间,将会得到 MySQL 的 'Table is full' 错误,InnoDB 将回滚这条 SQL 语句。
事务的死锁或锁定等待的超时将会使 InnoDB 回滚整个事务。
一个重复键(duplicate key)只会回滚插入的细节行,甚至在如同 INSERT INTO ... SELECT ...的一个语句中。这或许会发生改变,所以如果在语句中没有指定 IGNORE 选项这个语句将产生回滚。
'row too long' 的错误将回滚整个 SQL 语句。
其它的错误主要由 MySQL 的代码层发现,它们将回滚相应的 SQL 语句。
MySQL 返回的某些错误代码
1005 ER_CANT_CREATE_TABLE 不能建立表。如果错误信息串引用 errno 150,那么表创建失败是由于外键约束没能正确的形成。
1016 ER_CANT_OPEN_FILE 不能够通过 .frm 文件在 InnoDB 数据文件中找到 InnoDB 表。查看下面的“发现并修复数据字典错误的操作”章节。
1114 ER_RECORD_FILE_FULL InnoDB 用光了表空间内的剩余空间。你必须增加一个新的数据文件。
1205 ER_LOCK_WAIT_TIMEOUT 锁等待超时期满。事务被回滚。
1213 ER_LOCK_DEADLOCK 事务死锁。需要重新运行事务。
1216 ER_NO_REFERENCED_ROW 当试图增加一个新行时,但是没有父记录存在,外键约束失败。必须先添加父记录。
1217 ER_ROW_IS_REFERENCED 删除一个有子记录存在的父行,外键约束失败。必须先删除子记录。
该贴被tngou编辑于2014-6-24 14:06:11
该贴由hui.chen转至本版2014-11-5 16:11:48