InnoDB automatically detects transaction
deadlocks and rolls back a transaction or transactions to break
the deadlock. Starting from MySQL 4.0.5,
InnoDB tries to pick small transactions to
roll back, the size of a transaction being determined by the
number of rows inserted, updated, or deleted. Prior to 4.0.5,
InnoDB always rolled back the transaction
whose lock request was the last one to build a deadlock, that
is, a cycle in the “waits-for” graph of
transactions.
Beginning with MySQL 4.0.20 and 4.1.2, InnoDB
is aware of table locks if innodb_table_locks =
1 (the default) and autocommit
= 0, and the MySQL layer above
InnoDB knows about row-level locks. Before
that, InnoDB cannot detect deadlocks where a
table lock set by a MySQL LOCK
TABLES statement is involved, or if a lock set by
another storage engine than InnoDB is
involved. You have to 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.

User Comments
Add your own comment.