Warum deadlocks geschehen in SQL Server?
So wie ich es verstehe, SQL-deadlocks passieren, wenn eine SPID beschäftigt ist die Verarbeitung eine andere Abfrage und es kann nicht sein belästigt, um einen anderen auszuführen, weil er so beschäftigt. Der SQL-Server "zufällig" wählt eine der Abfragen zu Deadlocks aus den Ressourcen gefragt, und versagt es sich, eine Ausnahme zu werfen.
Habe ich eine app läuft ~ 40-Instanzen und einem back-end-Windows-Dienst, die alle auf die gleiche Datenbank zu. Ich bin auf der Suche zu reduzieren, deadlocks, also kann ich erhöhen, die Anzahl der threads, die ich kann läuft gleichzeitig.
- Warum nicht SQL-Server enqueue-die neue Abfrage, und führen Sie es, wenn Sie Zeit hat und die Ressourcen stehen zur Verfügung? Das meiste, was ich mache, das kann ein paar Sekunden warten, bei Gelegenheit.
- Gibt es eine Möglichkeit, um Transaction Isolation Level Global zimmerreserviereung, ohne das Sie angeben, die am Beginn jeder neuen Verbindung/session?
- Ihre definition von
deadlock
ist nicht korrekt. Normalerweise SQL-Server nicht lassen Sie andere Anfragen warten. Wenn Sie tötet eine Abfrage, da es erkennt einen deadlock, weil die gegebenen Satz von Abfragen, die nicht abgeschlossen werden kann (je), und jemand zu verlieren. Ich denke wenn man ein wenig Lesen, was deadlocks sind, werden Sie in einer viel besseren position, um nutzen aus einer besseren Frage - "So wie ich es verstehe" ...der rest von diesem Absatz ist so ziemlich falsch.
- Deadlocks haben nichts mit dem server zu beschäftigt, um eine Anfrage. Ich schlage vor, Sie entweder formulieren Sie Ihre Frage oder gehen Sie nachschlagen, was ein deadlock ist wirklich.
- Ihr Verständnis von deadlock ist falsch, aber ich denke du hast eine gute Frage.
- lmao @heisenberg geht HAM zurück in 2011...das ist okay tsilb ich von Ihnen positiv bewertet werden Ihre furchtbar falsche Frage. Ich meine wirklich, wer nicht weiß, was ein deadlock ist? googles " was ist deadlock`
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihrem Verständnis von deadlocks ist nicht korrekt. Was du beschrieben hast, zu blockieren. Es ist ein häufiger Fehler gleichsetzen der beiden.
Tritt ein deadlock auf, wenn zwei separate Transaktionen, die jeweils unterschiedliche Ressourcen und auch nicht die Version die, die Sie haben, so dass die anderen können laufen. Es ist wahrscheinlich einfacher zu veranschaulichen:
SPID #1 bekommt eine Sperre auf Eine Ressource
SPID #2 bekommt eine Sperre auf resource B
SPID #1 muss nun eine Sperre auf resource B, um die vollständige
SPID #2 muss nun eine Sperre auf Eine Ressource, um die vollständige
SPID #1 kann nicht abgeschlossen werden (und dafür release-Ressource A) weil SPID #2 hat es
SPID #2 kann nicht abgeschlossen werden (und dafür release-Ressource B) weil SPID #1 hat es
Da weder SPID, kann ein zu geben hat (d.h. die gewählt werden, durch den server als deadlock-Opfer) und wird scheitern.
Der beste Weg, Sie zu vermeiden ist, um Ihre Transaktionen klein (in der Anzahl der Ressourcen, die benötigt werden) und schnell.
rollback
). Kein Betrag der darauf wartet, Speicher, Festplatte, etc. helfen kannaba_lockinfo
Werkzeug sehr hilfreichDeadlock ist, wo zwei Fäden, die von der Verarbeitung sind beide gehalten, von der anderen ( es können mehr sein, aber zwei ist ausreichend Komplex ). So ein thread sperrt einen Tisch, dann fordert eine Sperre auf einem anderen Tisch. die andere Tabelle ist gesperrt durch den zweiten thread, die Fortschritte nicht, weil es auf eine Sperre wartet auf die erste Tabelle.
Dem Grund, dass man von diesen hat, geworfen zu werden, ist, dass in einer Sackgasse, Sie wird nie zu Ende - weder der thread kann Fortschritt überhaupt. Die einzige Antwort ist, für einen zu stoppen, um die anderen zu vervollständigen.
Die Lösung zur Reduktion von deadlocks in die Art von situation, die Sie reden können um die Neugestaltung der Lösung. Wenn Sie sicherstellen können, dass weniger sperren Auftritt, haben Sie weniger deadlocks.
Deadlocks tritt auf, weil zwei gleichzeitige Transaktionen können sich überschneiden e lock unterschiedliche Ressourcen benötigt, die von der anderen Transaktion zu beenden.
Stellen wir uns vor:
1 - Eine Transaktion sperren row1
2 - - Transaktion B-sperren row2
3 - Transaktion Ein, versucht zu sperren, row1, und, weil von der vorherigen Sperre, SQL server wartet
4 - Transaktion B versucht, lock row2, und, weil von der vorherigen Sperre, SQL-server wartet,
So, muss SQL server wählen, auf die Transaktion, töten Sie es, und lassen Sie die anderen weiter.
Diesem Bild ilustrates diese situation sehr gut: http://www.eupodiatamatando.com/wp-content/uploads/2008/01/deadlocknajkcomafarialibh3.jpg