deadlock
A situation where different transactions are unable to proceed, because each holds a lock that the other needs. Because both transactions are waiting for a resource to become available, neither will ever release the locks it holds.
A deadlock can occur when the transactions lock rows in multiple tables (through statements such as UPDATE
or SELECT ... FOR UPDATE
), but in the opposite order. A deadlock can also occur when such statements lock ranges of index records and gaps, with each transaction acquiring some locks but not others due to a timing issue.
To reduce the possibility of deadlocks, use transactions rather than LOCK TABLE
statements; keep transactions that insert or update data small enough that they do not stay open for long periods of time; when different transactions update multiple tables or large ranges of rows, use the same order of operations (such as SELECT ... FOR UPDATE
) in each transaction; create indexes on the columns used in SELECT ... FOR UPDATE
and UPDATE ... WHERE
statements. The possibility of deadlocks is not affected by the isolation level, because the isolation level changes the behavior of read operations, while deadlocks occur because of write operations.
If a deadlock does occur, InnoDB detects the condition and rolls back one of the transactions (the victim). Thus, even if your application logic is perfectly correct, you must still handle the case where a transaction must be retried. To see the last deadlock in an InnoDB user transaction, use the command SHOW ENGINE INNODB STATUS
. If frequent deadlocks highlight a problem with transaction structure or application error handling, run with the innodb-print-all-deadlocks
setting enabled to print information about all deadlocks to the mysqld
error log.
See also concurrency.
See also gap.
See also isolation level.
See also lock.
See also locking.
See also rollback.
See also transaction.
See also victim.