Две последовательности «запись, затем чтение» могут определенно зайти в тупик. Вы пропустили некоторые «подробности» в своем сообщении, например, о том, что является реальным ресурсом, на котором возникает тупик, и тем, что запросы связаны. Мы пролетим мимо штанов и будем читать между строк, составляя большую часть кейса из такого плохо документированного поста:
- Перекрестная запись-чтение. Поток 1 вставляет строку с ключом A, а затем выбирает строку с ключом B. Поток 2 вставляет строку с ключом B, затем выбирает строку с ключом A. Порядок выполнения: T1 (A), T2 (B), T1 (B) - ожидание, T2 (А) -deadlock.
- Независимая запись-чтение: T1 вставляет A, затем читает A, T2 вставляет B, затем читает B. Критическая информация: нет индекса на ключе, поэтому для чтения A и / или B требуется сканирование таблицы. 1007 *. Порядок выполнения: T1 пишет A, T2 пишет B, T1 читает A, начинает сканирование, блокирует X-блокировку T2 на B, T2 читает B, начинает сканирование, блокирует X-блокировку T1 на A, тупик.
- Независимо оптимизировано запись-чтение. Этот случай является наиболее пугающим для большинства новичков, когда имеются надлежащие индексы доступа, но все еще возникают тупики. Я представил этот случай в тупик чтения / записи , обновление может заблокировать чтение только из-за другого порядка доступа к индексу. Вряд ли это ваш случай, но с такой плохой документацией все возможно.
Возможны многие и многие тупиковые сценарии, но мы вводим эзотерику или начинаем довольно далеко экстраполировать пропущенную информацию в ОП.
Если бы я рискнул предположить, наиболее вероятный случай - 2). Случай 1), вероятно, будет легко идентифицировать. Случай 2) немного сложнее обнаружить в простом анализе кода, поскольку он зависит от физической схемы (структуры индекса).