An update with a WHERE clause that is not a unique column causes a deadlock if another transaction is waiting for the current transaction to complete. Here is a quick test:
CREATE TABLE test (pk int PRIMARY KEY, a int); INSERT INTO test VALUES (0, 0); INSERT INTO test VALUES (1, 0);
Session 1
BEGIN; SELECT a FROM test WHERE pk=0 FOR UPDATE;
Session 2
BEGIN; SELECT a FROM test WHERE pk=0 FOR UPDATE;
(Session 2 is now locked)
Session 1
UPDATE test SET a=1 WHERE a>0;
In session 2, we get an error
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
If the update WHERE clause uses only the pk column, an error does not occur.
source share