Warum finden Deadlocks in SQL Server statt?

8

So wie ich es verstehe, passieren SQL-Deadlocks, wenn ein SPID mit der Verarbeitung einer anderen Abfrage beschäftigt ist und es nicht störend sein kann, einen anderen auszuführen, weil es gerade so beschäftigt ist. Der SQL Server wählt nach dem Zufallsprinzip eine der Abfragen aus, um die angeforderten Ressourcen zu sperren, und scheitert mit einer Ausnahme.

Ich habe eine App mit ~ 40 Instanzen und einem Back-End-Windows-Dienst, die alle dieselbe Datenbank erreichen. Ich versuche, Deadlocks zu reduzieren, damit ich die Anzahl der Threads erhöhen kann, die ich gleichzeitig ausführen kann.

  1. Warum kann SQL Server die neue Abfrage nicht einfach in die Warteschlange stellen und sie ausführen, wenn sie Zeit hat und die Ressourcen verfügbar sind? Das meiste, was ich mache, kann gelegentlich ein paar Sekunden warten.
  2. Gibt es eine Möglichkeit, die Transaktionsisolationsstufe global festzulegen, ohne sie zu Beginn jeder neuen Verbindung / Sitzung angeben zu müssen?
tsilb 21.07.2011, 19:10
quelle

3 Antworten

18

Ihr Verständnis von Deadlocks ist nicht korrekt. Was du beschrieben hast, ist Blockieren. Es ist ein häufiger Fehler, die beiden gleichzusetzen.

Ein Deadlock tritt auf, wenn zwei separate Transaktionen jeweils unterschiedliche Ressourcen haben und keiner den anderen freigeben wird, damit der andere ausgeführt werden kann. Es ist wahrscheinlich einfacher zu veranschaulichen:

SPID # 1 erhält eine Sperre für Ressource A SPID # 2 erhält eine Sperre für Ressource B SPID # 1 benötigt nun eine Sperre für Ressource B, um abgeschlossen zu werden SPID # 2 benötigt nun eine Sperre für Ressource A, um

abzuschließen

SPID # 1 kann nicht abgeschlossen werden (und daher Ressource A freigeben), da SPID # 2 es hat SPID # 2 kann nicht abgeschlossen werden (und daher Ressource B freigeben), da SPID # 1 es

hat

Da keine SPID abgeschlossen werden kann, muss man aufgeben (d. h. vom Server als Deadlock-Opfer gewählt werden) und wird fehlschlagen.

Der beste Weg, sie zu vermeiden, besteht darin, Ihre Transaktionen klein (in der Anzahl der benötigten Ressourcen) und schnell zu halten.

    
Tom H 21.07.2011, 19:15
quelle
3

Deadlock ist der Punkt, an dem zwei Verarbeitungsprozesse vom anderen gehalten werden (es kann mehr sein, aber zwei sind ausreichend komplex). Ein Thread sperrt also eine Tabelle und fordert dann eine Sperre für eine andere Tabelle an. Die andere Tabelle wird durch den zweiten Thread gesperrt, der nicht fortgeführt werden kann, weil er auf eine Sperre für die erste Tabelle wartet.

Der Grund dafür, dass einer von ihnen rausgeschmissen werden muss, ist der, dass sie niemals enden werden - in einem Stillstand können sich beide gar nicht weiterentwickeln. Die einzige Antwort ist, dass man gestoppt wird, um dem anderen das Ende zu ermöglichen.

Die Lösung zur Reduzierung von Deadlocks in der Situation, über die Sie sprechen, könnte darin bestehen, die Lösung neu zu gestalten. Wenn Sie sicherstellen können, dass weniger Sperren auftreten, haben Sie weniger Deadlocks.

    
Schroedingers Cat 21.07.2011 19:15
quelle
1

Deadlocks treten auf, weil sich zwei gleichzeitige Transaktionen mit verschiedenen Ressourcen überschneiden können, die beide von der anderen Transaktion zum Beenden benötigt werden.

Stellen wir uns vor: 1 - Transaktion A sperrt row1 2 - Transaktion B sperrt row2 3 - Transaktion A versucht, row1 zu sperren, und SQL Server wartet aufgrund der vorherigen Sperre 4 - Transaktion B versucht, row2 zu sperren, und SQL Server wartet wegen der vorherigen Sperre

Also muss der SQL-Server eine Transaktion auswählen, sie beenden und dem anderen erlauben, fortzufahren.

Dieses Bild illustriert diese Situation sehr gut: Ссылка

    
Adilson de Almeida Jr 21.07.2011 19:19
quelle

Tags und Links