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


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системною збереженою процедурою, щоб взяти все, що вам потрібно буде блокувати у вашому зразковому коді.

Власне кажучи, це семафор Дійкстри . Ще блінно корисно, хоча


sp_getapplockне призведе до помилки. Він або дочекається закінчення терміну очікування, або (якщо немає очікування), повернеться -3( msdn.microsoft.com/en-us/library/ms189823.aspx )
Ian Boyd

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/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.