Вы можете запустить трассировку профилировщика на своем устройстве для запросов и посмотреть, какие именно блокировки приняты. Как правило, это огромный объем данных, но в большинстве случаев это шаблоны, которые вы можете просмотреть. Например. для изолированной фиксации чтения вы увидите последовательность блокировок, получаемых и снимаемых при сканировании таблицы или индекса (каждая строка должна быть заблокирована до того, как будет прочитана, и сразу же после ее чтения будет снята).
Под какой изоляцией вы работаете? Какие типы запросов являются взаимоблокирующими? Используете ли вы явные транзакции, которые охватывают несколько обновлений, или они блокируют отдельные операторы?
Наиболее типичным случаем взаимоблокировки является транзакция с последовательностью (таблица обновлений x, таблица обновлений y) и вторая транзакция с последовательностью (таблица обновлений y, таблица обновлений x). Общее решение состоит в том, чтобы убедиться, что вы используете одну и ту же последовательность обновления в запросах.
Сообщите нам, к какому типу запросов они относятся, существуют разные общие проблемы для разных типов транзакций.