Ich teste meine Anwendung. Ich benötige Code, der stabil den Deadlock auf der Datenbank-Site simuliert (SQL-Skript, wenn möglich).
Vielen Dank.
HINZUGEFÜGT:
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, damit 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 laufen
BEGIN TRAN
update table_a set ID=ID where ID = 100;
Bei zwei Läufen
BEGIN TRAN
update table_b set ID=ID where ID =100;
Kopieren Sie dann die Update-Anweisungen 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 es gerade versucht und bin auf MS-SQL gekommen
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.
Verwenden Sie die sp_getapplock
System gespeicherte Prozedur, um alle Sperren zu übernehmen, die für Ihren Beispielcode erforderlich sind.
Genau genommen ist dies ein Dijkstra-Semaphor . Trotzdem verdammt nützlich
Hier ist eine andere Methode ähnlich der oben beschriebenen ->
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, das im Abfragefenster Nr. 1 verwendet werden soll
BEGIN TRAN
INSERT dbo.Tbl1 (id, col) VALUES (2, 999)
Skript, das im Abfragefenster Nr. 2 verwendet werden soll
BEGIN TRAN
INSERT dbo.Tbl2 (id, col) VALUES (111, 2)
Skript, das dem 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/