Я тестирую свое приложение, мне нужен код, который стабильно имитирует тупик на сайте базы данных (сценарий sql, если это возможно).
Спасибо.
ДОБАВЛЕНО:
Я тестирую свое приложение, мне нужен код, который стабильно имитирует тупик на сайте базы данных (сценарий sql, если это возможно).
Спасибо.
ДОБАВЛЕНО:
Ответы:
Лучший способ - использовать таблицы, которые у вас уже есть. Создайте две таблицы - 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.
Используйте sp_getapplock
системную хранимую процедуру, чтобы взять все, что нужно для блокировки, в вашем примере кода.
Строго говоря, это семафор Дейкстры . Тем не менее, чертовски полезно, хотя
sp_getapplock
не выдаст ошибку. Он будет либо ожидать истечения времени ожидания, либо (если его нет) вернуть -3
( msdn.microsoft.com/en-us/library/ms189823.aspx )
Вот еще один метод, похожий на тот, который выложен выше ->
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/