14.2.10.10. Deadlock Detection and Rollback
InnoDB
automatically detects a deadlock of
transactions and rolls back a transaction or transactions to
break the deadlock. InnoDB
tries to pick
small transactions to roll back, where the size of a transaction
is determined by the number of rows inserted, updated, or
deleted.
InnoDB
is aware of table locks if
innodb_table_locks=1
(the default) and
AUTOCOMMIT=0
, and the MySQL layer above it
knows about row-level locks. Otherwise,
InnoDB
cannot detect deadlocks where a table
lock set by a MySQL LOCK TABLES
statement or
a lock set by a storage engine other than
InnoDB
is involved. You must resolve these
situations by setting the value of the
innodb_lock_wait_timeout
system variable.
When InnoDB
performs a complete rollback of a
transaction, all locks set by the transaction are released.
However, if just a single SQL statement is rolled back as a
result of an error, some of the locks set by the statement may
be preserved. This happens because InnoDB
stores row locks in a format such that it cannot know afterward
which lock was set by which statement.