SqlException: Deadlock
Habe ich diese zwei Ausnahmen werden generiert, wenn ich versuche, Daten aus SQL-Datenbank in C#:
System.Daten.SqlClient.SqlException: Transaktion (Prozess-ID 97) befand sich auf sperren von Ressourcen mit einem anderen Prozess und wurde als Deadlockopfer ausgewählt.
ODER
System.Daten.SqlClient.SqlException: Transaktion (Prozess-ID 62) befand sich auf sperren von Ressourcen mit einem anderen Prozess und wurde als Deadlockopfer ausgewählt.
ODER
System.Daten.SqlClient.SqlException: Transaktion (Prozess-ID 54) befand sich auf sperren von Ressourcen mit einem anderen Prozess und wurde als Deadlockopfer ausgewählt. Führen Sie erneut die Transaktion.
dies ist der code:
using (SqlConnection con = new SqlConnection(datasource))
{
SqlCommand cmd = new SqlCommand("Select * from MyTable Where ID='1' ", con);
cmd.CommandTimeout = 300;
con.Open();
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adapter.Fill(ds);
con.Close();
return ds.Tables[0];
}
Diese passiert jedes mal.
Irgendwelche Ideen auf, wie diese gelöst werden können?
- Hast du diese Ausnahme einmal oder passiert das jedes mal, wenn Sie versuchen?
- Konnte Sie zeigen, dass Ihre Abfrage?
- Diese hapend jedes mal, wenn ich versuche.
- Meine Abfrage: Select * From MyTable Where PRODUCT_ID = '1'
- Es muss noch andere Abfragen laufen zur gleichen Zeit, das ist, warum es deadlocks. Zwei oder mehr Abfragen wollen, auf die gleichen Daten zugreifen. Wir müssen sehen, alle Abfragen, die ausgeführt werden, nicht nur die eine, wird die deadlock-Opfer.
- Sie nicht bekommen kann ein deadlock aus einer Abfrage so. Es erfordert eine read-Sperre auf 1 Zeile 1 Tabelle. Auch wenn ein anderer Prozess das lock, es würde gewartet haben, glücklich bis ans Zeitüberschreitung der Anforderung. Um eine Sackgasse, die in der Regel Process1 Sperre Ein und wartet auf lock B; während Prozess2 Sperre B und wartet auf lock-A. Es muss einige andere Abfragen beteiligt. Führen Sie den Sql Server Profiler (msdn.microsoft.com/en-us/library/ms187929.aspx) und zu überwachen, welche Suchanfragen ausführen, die auf Ihre Datenbank.
- Mehr Profiler und deadlock-Analyse links: (1) support.microsoft.com/default.aspx?scid=kb;en-us;832524 (2) msdn.microsoft.com/en-us/library/ms188246.aspx (3) msdn.microsoft.com/en-us/library/ms190465.aspx
- Jeff Atwood hatte die gleiche Ausnahme einer Weile zurück: Coding Horror: Festgefahren!. Sein Artikel könnte helfen 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht, dass dies helfen wird, die deadlock-Problem, aber Sie sollten die Entsorgung Ihrer anderen
IDisposable
Objekte so wie Sie sind entsorgen IhreSqlConnection
als solche:Können Sie möglicherweise zu vermeiden, das Schloss mit einem sperrhinweis in deine Abfrage folgendermassen:
Hoffe, das hilft.
Gibt es ein paar Dinge, die Sie tun können, um zu verringern die Anzahl der deadlocks, die Sie erhalten, und einige Dinge, die Sie tun können, um vollständig zu eliminieren Sie.
First off, starten Sie SQL Server Profiler und sagen, geben Sie eine deadlock-Diagramm. Läuft diese Spur wird Ihnen sagen, die anderen Abfrage, die in Konflikt mit Ihnen. Ihre Abfrage ist ganz einfach, obwohl ich bezweifle ernsthaft, Sie haben eine
SELECT *
Abfrage aus einer Tabelle namens MyTable in Ihrem system...Sowieso, bewaffnet mit der deadlock-graph und die andere Abfrage, die Sie sollten in der Lage sein zu sagen, was Ressourcen sind Deadlocks. Die klassische Lösung ist die änderung der Reihenfolge der beiden Abfragen, so dass der Zugriff auf Ressourcen in der gleichen Reihenfolge-dies vermeidet Zyklen.
Andere Dinge, die Sie tun können:
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
in Ihre Transaktionen gegebenenfalls. Auch ermöglichen read committed with row-Versionierung. In vielen Fällen ist dies genug, um zu beseitigen die meisten deadlocks komplett. Lesen Sie über die Transaktion isolation levels. Verstehen , was du tust.Grundsätzlich die SQL server concurrency-Modell macht es so man kann nie vermeiden, diese Ausnahme (zB. völlig unabhängig von der Transaktion blockieren sich gegenseitig, wenn Sie geschehen, zu sperren, die den gleichen index-Seite oder so). Das beste, was Sie tun können, ist, halten Sie Ihre Transaktionen so kurz wie möglich zu reduzieren, die Wahrscheinlichkeit, und wenn man die Ausnahme, das tun, was es sagt, und wiederholen Sie die Transaktion.