Почему это происходит?
Ниже сценарии воспроизводят тупик.
create table foo (id int primary key, name varchar(100));
insert into foo values (1, 'foo1');
-- transaction A
start transaction;
select * from foo where id=1 for update;
-- transaction B
start transaction;
select * from foo where id=1 for update;
-- now waiting
-- transaction A
select * from foo where name='xxxxx' for update;
-- transaction B dead lock occer
Я догадался, что ответ на вопрос.
MySQL блокирует все записи при выборе для поиска без индексации столбца.
https://dev.mysql.com/doc/refman/5.7/en/innodb-locks-set.html
Если у вас нет индексов, подходящих для вашего утверждения, и MySQL должен проверять всю таблицу для обработки инструкции, каждая строка таблицы становится заблокированной, что, в свою очередь, блокирует все вставки другими пользователями в таблицу.
Но я не знаю, почему это вызывает тупик.
Кстати, я решил свою проблему, что каждый выбор для обновления для поиска по первичному ключу.