Как имитировать взаимоблокировку в SQL Server в одном процессе?

Наш код на стороне клиента обнаруживает взаимоблокировки, ожидает определенный интервал, а затем повторяет запрос до 5 раз. Логика повторных попыток обнаруживает взаимоблокировки на основе номера ошибки 1205.

Моя цель — протестировать как логику повторных попыток взаимоблокировки, так и обработку взаимоблокировок внутри различных хранимых процедур. Я могу создать тупик, используя два разных соединения. Однако я хотел бы имитировать взаимоблокировку внутри одной хранимой процедуры.

Взаимоблокировка вызывает следующее сообщение об ошибке:

Msg 1205, Level 13, State 51, Line 1
Transaction (Process ID 66) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

Я вижу это сообщение об ошибке в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, Level 16, State 1, Line 1
Error number 1205 is invalid. The number must be from 13000 through 2147483647 and it cannot be 50000.

Наша логика повторной попытки взаимоблокировки проверяет, является ли номер ошибки 1205. Взаимоблокировка должна иметь тот же идентификатор сообщения, уровень и состояние, что и обычная взаимоблокировка.

Есть ли способ имитировать взаимоблокировку (с помощью RAISERROR или любых других средств )и получить тот же номер сообщения только с одним процессом ?

Наши базы данных используют совместимость с SQL 2005, хотя наши серверы различаются с 2005 по 2008 R2.

27
задан Paul Williams 19 July 2012 в 22:17
поделиться