Я думаю, что есть несколько возможностей в ответах, уже предоставленных здесь. Поскольку вы берете только общие блокировки, тупик не может быть вызван эскалацией блокировки, и он должен просто получать блокировки, несовместимые с блокировками, полученными в другом процессе, и получать эти блокировки в другом порядке ...
Ваши общие блокировки несовместимы с другим процессом, использующим эксклюзивные блокировки. Сценарий может запустить что-то вроде этого ...
- Вы принимаете общую блокировку на ресурсе A
- Другой процесс получает эксклюзивную блокировку ресурса B
- Другой процесс пытается получить монопольную блокировку на ресурсе A и блокирует ожидание освобождения вашей общей блокировки на A.
- Вы пытаетесь взять общую блокировку на ресурсе B и заблокировать ожидание, пока другой процесс освободит свою эксклюзивную блокировку на B, за исключением того, что вы сейчас находитесь в тупиковой ситуации, которая определяется сервером и выбирает процесс убить.
N.B. В тупиках может быть больше игроков, чем просто 2. Иногда существует целая цепочка переплетенных действий, которые приводят к тупику, но принцип тот же.
Часто, если несколько приложений обращаются к одной и той же базе данных, существует администратор БД, который управляет всем доступом через хранимые процедуры, поэтому он может гарантировать, что ресурсы всегда заблокированы в одном и том же порядке. Если вы не в такой ситуации, а другие приложения используют специальные операторы SQL, вам придется проверить их код, чтобы выяснить, не могут ли они конфликтовать с вашим приложением, как я описал. Это не похоже на веселье.
Прагматичным решением может быть обнаружение ошибки, когда ваша транзакция уничтожена как жертва тупика, и просто повторите попытку несколько раз. В зависимости от того, сколько активности генерируют другие приложения, вы можете достичь приемлемых результатов таким образом.