Код для симуляции тупика

26

Я тестирую свое приложение, мне нужен код, который стабильно имитирует тупик на сайте базы данных (сценарий sql, если это возможно).

Спасибо.

ДОБАВЛЕНО:

Воспроизведение взаимоблокировок только с одной таблицей

Гарик
источник
2
Я не совсем понимаю вопрос. Можете ли вы перефразировать это немного? Очевидно, что два человека внизу поняли вас достаточно хорошо, но я не совсем понимаю вас. Вы имеете в виду код, который "стабильно" симулирует тупик? Что вы будете делать после тупика? Вы просто хотите доказать, что это может произойти?
Jcolebrand

Ответы:

29

Лучший способ - использовать таблицы, которые у вас уже есть. Создайте две таблицы - table-a, table-b. Для теста вы можете даже обновить один и тот же столбец с той же информацией, чтобы не влиять на реальные данные.

Например, UPDATE table_a set ID = ID, где ID = 100;

Откройте две сессии в одной базе данных. На одном, беги

BEGIN TRAN
update table_a set ID=ID where ID = 100;

На два запуска

BEGIN TRAN
update table_b set ID=ID where ID =100;

Затем скопируйте операторы обновления в противоположные сеансы и запустите их одновременно. В одном,

update table_b set ID=ID where ID =100;

В два

update table_a set ID=ID where ID = 100;

Я только что попробовал это сейчас и попал на MS-SQL

Msg 1205, Level 13, State 56, Line 1
Transaction (Process ID 23) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
Дэвид Холл
источник
7

Используйте sp_getapplockсистемную хранимую процедуру, чтобы взять все, что нужно для блокировки, в вашем примере кода.

Строго говоря, это семафор Дейкстры . Тем не менее, чертовски полезно, хотя

mrdenny
источник
sp_getapplockне выдаст ошибку. Он будет либо ожидать истечения времени ожидания, либо (если его нет) вернуть -3( msdn.microsoft.com/en-us/library/ms189823.aspx )
Ян Бойд,
2

Вот еще один метод, похожий на тот, который выложен выше ->

CREATE TABLE Tbl1 (id INT NOT NULL PRIMARY KEY CLUSTERED, col INT)
CREATE TABLE Tbl2 (id INT NOT NULL PRIMARY KEY CLUSTERED, col INT REFERENCES dbo.Tbl1(id))

Скрипт для использования в окне запросов № 1

BEGIN TRAN
INSERT dbo.Tbl1 (id, col) VALUES (2, 999)

Скрипт для использования в окне запросов № 2

BEGIN TRAN
INSERT dbo.Tbl2 (id, col) VALUES (111, 2)

Скрипт для добавления в окно запроса № 1

INSERT dbo.Tbl2 (id, col) VALUES (111, 555)

Для получения дополнительной информации об этом, обратитесь к http://ajitananthram.wordpress.com/2014/02/23/scripts-to-force-a-deadlock-in-sql-server/

Аджит Анантрам
источник