Safari Books Online is a digital library providing on-demand subscription access to thousands of learning resources.
Deadlock is a situation when two or more competing transactions are waiting for each other to free locks, and thus neither ever finishes. With row-level locking, deadlocks are not 100% avoidable.
InnoDB has an internal deadlock detector. When it finds one, it just rolls back one of the transactions, reporting an error that we’ll see momentarily. When designing an application, you need to be prepared for such a situation and handle the rollback appropriately.
Information about deadlocks can be found in SHOW ENGINE INNODB STATUS. To demonstrate
this, we will examine a trivial example of a deadlock.
The initial data is:
mysql>CREATE TABLE `t` ( `a` int(10) unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;Query OK, 0 rows affected (0.27 sec) mysql>INSERT INTO t VALUES();Query OK, 1 row affected (0.16 sec) mysql>INSERT INTO t SELECT NULL FROM t;Query OK, 1 row affected (0.11 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql>INSERT INTO t SELECT NULL FROM t;Query OK, 2 rows affected (0.09 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql>SELECT * FROM t;+---+ | a | +---+ | 1 | | 2 | | 3 | | 4 | +---+ 4 rows in set (0.00 sec)