Я думаю, что существует целый ряд возможностей в ответах, которые уже предусмотрены здесь. Поскольку вы используете только общие шлюзы, тупик не может быть вызван эскалацией блокировки и должен просто получать блокировки, которые несовместимы с теми, которые получены в другом процессе, и приобретать эти блокировки в другом порядке ...
Ваш общие блокировки несовместимы с другим процессом, использующим эксклюзивные блокировки. Сценарий может запустить что-то вроде этого ...
- вы берете общую блокировку по ресурсной
- Другой процесс занимает монопольную блокировку ресурса B
- Другой процесс пытается взять эксклюзивную блокировку ресурса А и блоки ожидая, когда вы отпустите свою общую блокировку на A.
- Вы пытаетесь использовать общую блокировку ресурса B и блокируете ожидание того, что другой процесс освободит свою исключительную блокировку на B, за исключением того, что вы сейчас находитесь в ситуации взаимоблокировки , который идентифицируется сервером, и он выбирает процесс для уничтожения.
N.B. тупики могут иметь больше игроков, чем просто 2. Иногда есть целая цепь переплетенных действий, которая приводит к тупиковой ситуации, но принцип тот же.
Часто, если несколько приложений обращаются к одной и той же базе данных, есть администратор базы данных, который управляет всем доступом через хранимые процедуры, поэтому он может гарантировать, что ресурсы всегда заблокированы в том же порядке. Если вы не в такой ситуации, а другие приложения используют специальные SQL-инструкции, вам нужно будет проверить их код, чтобы узнать, могут ли они конфликтуют с вашим приложением так, как я описал. Это не похоже на забаву.
Практическое решение может заключаться в том, чтобы поймать ошибку, когда ваша транзакция убита как жертва взаимоблокировки, и просто повторите попытку транзакции несколько раз. В зависимости от того, насколько активны другие приложения, вы можете достичь приемлемых результатов таким образом.
Надеюсь, вы уже научились тому, что READ может определенно затормозить, многие ответы указали, как это происходит. Теперь вам нужно сделать домашнее задание и предоставить остальную информацию, т.е. который блокирует * с * и тупиковый график. –
К сожалению, я могу только воспроизвести проблему на производственной системе, поэтому я должен ее замедлить и ничего не пихать. Кроме того, я могу только добраться до сервера через странную комбинацию VPN/VNC/Remote Desktop/Custom file transfer tool (не спрашивать), поэтому даже одна проверка или копирование нового исполняемого файла занимает много времени. –