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


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.