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