Насколько я понимаю, выбор не получает блокировку и не должен быть причиной тупика.
Каждый раз, когда вы вставляете / обновляете / удаляете строку, блокировка получается. Чтобы избежать взаимоблокировки, необходимо убедиться, что параллельные транзакции не обновляют строки в порядке, который может привести к взаимоблокировке. Вообще говоря, чтобы избежать взаимоблокировки , вы должны получать блокировку всегда в одном и том же порядке даже в другой транзакции (например, всегда сначала таблица A, затем таблица B).
Но если в рамках одной транзакции вы вставляете только одну таблицу, это условие выполняется, и это обычно не должно приводить к тупику. Вы делаете что-то еще в сделке?
Однако может возникнуть тупик, если отсутствуют индексы . Когда строка вставляется / обновляется / удаляется, базе данных необходимо проверить реляционные ограничения, то есть убедиться, что отношения согласованы. Для этого базе данных необходимо проверить внешние ключи в связанных таблицах. Это может привести к получению другой блокировки, кроме строки, которая была изменена. Тогда убедитесь, что у индекса всегда есть внешние ключи (и, конечно, первичные ключи), иначе это может привести к блокировке таблицы вместо блокировке строки . Если блокировка таблицы происходит, конкуренция за блокировку выше и вероятность взаимоблокировки увеличивается.
Не уверен, что именно происходит в вашем случае, но, возможно, это поможет.