Kod symulujący zakleszczenie

26

Testuję swoją aplikację Potrzebuję trochę kodu, który stabilnie symuluje impas na stronie bazy danych (skrypt SQL, jeśli to możliwe).

Dziękuję Ci.

DODANY:

Odtwarzanie zakleszczeń obejmujące tylko jeden stół

garik
źródło
2
Nie do końca rozumiem pytanie. Czy możesz to trochę przeredagować? Oczywiście dwie osoby poniżej zrozumiały cię wystarczająco dobrze, ale nie do końca cię śledzę. Czy masz na myśli kod, który „stabilnie” symuluje impas? Co będziesz robił po impasie? Chcesz tylko udowodnić, że tak się może stać?
jcolebrand

Odpowiedzi:

29

Najlepszym sposobem byłoby użycie tabel, które już masz. Utwórz dwie tabele - tabela-a, tabela-b W przypadku testu możesz nawet zaktualizować tę samą kolumnę o te same informacje, aby nie wpływać na żadne rzeczywiste dane.

Na przykład UPDATE table_a ustaw ID = ID gdzie ID = 100;

Otwórz dwie sesje dla tej samej bazy danych. Na jeden biegnij

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

Dwa biegi

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

Następnie skopiuj instrukcje aktualizacji do sesji przeciwnych i uruchom je w tym samym czasie. W jednym,

update table_b set ID=ID where ID =100;

We dwóch

update table_a set ID=ID where ID = 100;

Właśnie próbowałem tego teraz i dostałem na 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.
David Hall
źródło
7

Użyj sp_getapplocksystemowej procedury składowanej, aby wziąć to, co kiedykolwiek blokuje twój przykładowy kod.

Ściśle mówiąc, jest to semafor Dijkstry . Wciąż cholernie przydatne

mrdenny
źródło
sp_getapplocknie zgłasza błędu. Będzie albo czekał na upłynięcie limitu czasu, albo (jeśli nie ma limitu czasu) zwróci -3( msdn.microsoft.com/en-us/library/ms189823.aspx )
Ian Boyd
2

Oto kolejna metoda podobna do tej zamieszczonej powyżej ->

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))

Skrypt do użycia w oknie zapytania nr 1

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

Skrypt do użycia w oknie zapytania nr 2

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

Skrypt do dodania do okna zapytania nr 1

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

Aby uzyskać dodatkowe informacje na ten temat, patrz http://ajitananthram.wordpress.com/2014/02/23/scripts-to-force-a-deadlock-in-sql-server/

Ajit Ananthram
źródło