Имитировать тупик, используя хранимую процедуру - PullRequest
3 голосов
/ 08 августа 2011

Кто-нибудь знает, как имитировать тупик, используя хранимую процедуру вставки или обновления значений?Я мог сделать это только в sybase, используя отдельные команды.

Спасибо, Ver

Ответы [ 3 ]

3 голосов
/ 08 августа 2011

Создайте две хранимые процедуры.

Первая должна запустить транзакцию, изменить таблицу 1 (и занять много времени), а затем изменить таблицу 2.

Вторая должна начать транзакцию,измените таблицу 2 (и займет много времени), а затем измените таблицу 1.


В идеале изменения должны затрагивать те же строки или создавать блокировки таблицы.


Затем в клиентском приложении запустите SP1, а затем сразу же запустите SP2 (до завершения SP1).

0 голосов
/ 23 января 2012

Простой и короткий ответ, чтобы получить тупик, будет получить доступ к данным таблиц в обратном порядке и, следовательно, ввести циклический тупик между двумя соединениями.Позвольте мне показать вам код:

Create table vin_deadlock (id int, Name Varchar(30)) 
GO 

Insert into vin_deadlock values (1, 'Vinod') 
Insert into vin_deadlock values (2, 'Kumar') 
Insert into vin_deadlock values (3, 'Saravana') 
Insert into vin_deadlock values (4, 'Srinivas') 
Insert into vin_deadlock values (5, 'Sampath') 
Insert into vin_deadlock values (6, 'Manoj') 
GO

Теперь, когда таблицы готовы.Просто обновите столбцы в обратном порядке из двух соединений, таких как:

-- Connection 1
Begin Tran 
Update vin_deadlock 
SET Name = 'Manoj' 
Where id = 6 
WAITFOR DELAY '00:00:10' 
Update vin_deadlock 
SET Name = 'Vinod' 
Where id = 1
and from connection 2

-- Connection 2
Begin Tran
Update vin_deadlock 
SET Name = 'Vinod' 
Where id = 1 
WAITFOR DELAY '00:00:10' 
Update vin_deadlock 
SET Name = 'Manoj' 
Where id = 6

И это приведет к тупику.Вы можете увидеть график взаимоблокировки из профилировщика.

0 голосов
/ 09 августа 2011

Запустите процесс, который непрерывно вставляет или обновляет таблицу, используя цикл while со скриптом, и запускайте нужный вам sp.

...