Наш код на стороне клиента обнаруживает взаимоблокировки, ждет интервал, а затем повторяет запрос до 5 раз. Логика повтора обнаруживает блокировки на основе номера ошибки 1205.
Моя цель - проверить как логику повтора логики тупика, так и тупиковую обработку внутри различных хранимых процедур. Я могу создать тупик, используя два разных соединения. Тем не менее, я хотел бы симулировать тупик внутри одной хранимой процедуры.
Тупик вызывает следующее сообщение об ошибке:
Msg 1205, уровень 13, состояние 51, строка 1
Транзакция (идентификатор процесса 66) была блокировка блокировки ресурсов другим процессом и выбрана как жертва тупика. Перезапустите транзакцию.
Я вижу, что это сообщение об ошибке находится в sys.messages
:
select * from sys.messages where message_id = 1205 and language_id = 1033
message_id language_id severity is_event_logged text
1205 1033 13 0 Transaction (Process ID %d) was deadlocked on %.*ls resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
Я не могу поднять эту ошибку, используя RAISERROR
:
raiserror(1205, 13, 51)
Msg 2732, уровень 16, состояние 1, строка 1
Номер ошибки 1205 недействителен. Номер должен быть от 13000 до 2147483647, и он не может быть 50000.
Наша логика повторной логики блокировки проверяет, равен ли номер ошибки 1205. В тупике должен быть одинаковый идентификатор, уровень и состояние сообщения как нормальный тупик.
Есть ли способ имитировать тупик (с помощью RAISERROR или любым другим способом) и получить один и тот же номер сообщения только с одним процессом?
Наши базы данных используют совместимость с SQL 2005, хотя наши серверы отличаются от 2005 до 2008 R2.