it-swarm.dev

Kod symulujący zakleszczenie

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

Dziękuję Ci.

DODANE:

Odtwarzanie zakleszczeń obejmujące tylko jedną tabelę

25
garik

Najlepszym sposobem byłoby użycie tabel, które już masz. Utwórz dwie tabele - tabela-a, tabela-b Na potrzeby 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.
29
David Hall

Użyj sp_getapplock systemowa procedura składowana, aby wziąć to, co kiedykolwiek blokuje twój przykładowy kod.

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

7
mrdenny

Oto inna 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/

2
Ajit Ananthram