Если вы находитесь в режиме изоляции транзакции REPEATABLE_READ (который используется по умолчанию), то выбор не должен создавать никаких блокировок.Это нормально.
Однако, если вы используете вставку ... выберите, конечно, вы получите блокировки в таблице назначения.
Таким образом, при условии, что никто не будет писать в таблицу назначения,И одновременно запускается не более одной копии вашей программы, вы никогда не сможете получить взаимоблокировку.
Застой происходит, когда два (или более) процесса пытаются делать конфликтующие вещи, которые никогда не могут завершиться.Обычно это включает в себя обновление одной и той же пары строк в различном порядке, но это может зависеть от структуры вашей таблицы.
идей для рассмотрения:
- Использование внешней блокировки (для innodb)чтобы сериализовать процесс для нескольких копий
- Измените режим изоляции транзакции на READ_COMMITTED для этой операции - если вы понимаете, что это значит, и можете это допустить.)
Вы можете увидеть, что делали транзакции, связанные с тупиком, используя SHOW ENGINE INNODB STATUS, сразу после тупика.
Вы должны увидеть, что делает другой процесс.были и чем занимались.Попробуйте включить общий журнал или использовать другие методы отладки.
Обязательно выполните любое тестирование в непроизводственной системе!