Какая последовательность блокировок строк происходит в случае SELECT … INNER JOIN … FOR UPDATE
Первый процесс начинает выполнять
SELECT... MT4_USERS... FOR UPDATE
. В MT4_USERS лочит, например, 1, 2... 3
В это же время второй процесс начинает выполнять
INSERT MT4_TRADES... MT4_USERS...
. В MT4_USERS лочит, например, 3... 2
Первый ждет анлока 3, второй ждет анлока 2. Дедлок.
как избежать deadlock?
Во-первых, убедиться, что autocommit выключен.
Во-вторых, в обоих запросах явно указать
... ORDER BY MT4_USERS.id ASC
Или другой способ:
CREATE TEMPORARY TABLE ... SELECT ...; UPDATE ...
В этом случае можно выкинуть
SELECT... FOR UPDATE