выполняем следующий код в 2+ потока?
START TRANSACTION;
INSERT INTO table_actions (type, method, choto, chtotototo, created_at, request_id, table2_id) VALUES (null, null, "chototo", 13, "data", null, 1);
UPDATE table2 SET field1 = "value1", __debug = (ROUND(RAND() * 1000)) WHERE id = 1;
COMMIT;
Где table2_id - является внешним ключем на запись таблицы table2. Если убрать внешний ключ - deadlock'ов не возникает. Если вписать SELECT 1 FROM table2 WHERE id = 1 FOR UPDATE; первым запросом в транзакцию (то есть залочить запись) - deadlock'ов не возникает. Если не выполнять INSERT по этому же внешнему ключу - Deadlock'ов не возникает. Если не оборачивать это в транзакцию - Deadlock'ов не возникает.
возможно будут полезны — https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html#innodb-intention-locks, https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html#innodb-record-locks
Обсуждают сегодня