Я тестую свою програму, мені потрібен код, який стабільно імітує тупик на сайті бази даних (якщо можливо, скрипт 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/