Code zum Simulieren eines Deadlocks

26

Ich teste meine Anwendung. Ich benötige Code, der den Deadlock auf der Datenbank-Site stabil simuliert (wenn möglich SQL-Skript).

Vielen Dank.

HINZUGEFÜGT:

Deadlocks reproduzieren, die nur eine Tabelle betreffen

Garik
quelle
2
Ich verstehe die Frage nicht ganz. Können Sie es ein wenig umformulieren? Offensichtlich haben die beiden unten Sie gut genug verstanden, aber ich verfolge Sie nicht ganz. Meinen Sie Code, der einen Deadlock "stabil" simuliert? Was werden Sie tun, nachdem ein Deadlock aufgetreten ist? Wollen Sie nur beweisen, dass es passieren kann?
jcolebrand

Antworten:

29

Am besten verwenden Sie bereits vorhandene Tabellen. Erstellen Sie zwei Tabellen - Tabelle-a, Tabelle-b. Für einen Test können Sie sogar dieselbe Spalte mit denselben Informationen aktualisieren, sodass Sie keine realen Daten beeinflussen.

Zum Beispiel UPDATE table_a setze ID = ID wobei ID = 100;

Öffnen Sie zwei Sitzungen in derselben Datenbank. Auf einen Lauf

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

Auf zwei laufen

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

Kopieren Sie dann die Aktualisierungsanweisungen in die gegnerischen Sitzungen und führen Sie sie gleichzeitig aus. In Eins,

update table_b set ID=ID where ID =100;

In zwei

update table_a set ID=ID where ID = 100;

Ich habe das gerade ausprobiert und bin auf MS-SQL umgestiegen

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

Verwenden Sie die sp_getapplockgespeicherte Systemprozedur, um alle Sperren zu übernehmen, die für Ihren Beispielcode erforderlich sind.

Genau genommen ist dies ein Dijkstra-Semaphor . Trotzdem verdammt nützlich

mrdenny
quelle
sp_getapplockWirft keinen Fehler. Entweder wird gewartet, bis das Timeout abgelaufen ist, oder (falls es kein Timeout gibt) wird um -3
Ian Boyd
2

Hier ist eine andere Methode ähnlich der oben angegebenen ->

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

Skript zur Verwendung in Abfragefenster 1

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

Skript zur Verwendung in Abfragefenster 2

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

Skript, das zum Abfragefenster Nr. 1 hinzugefügt werden soll

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

Weitere Informationen hierzu finden Sie unter http://ajitananthram.wordpress.com/2014/02/23/scripts-to-force-a-deadlock-in-sql-server/

Ajit Ananthram
quelle