sql server-hint NOLOCK und ROWLOCK
Ich bin derzeit ein ärgerliches problem auf meiner website. Wir verlosen die Preise regelmäßig auf der website, aber um am Wettbewerb teilzunehmen müssen die Menschen anmelden. So die website wird viel beschäftigt, manchmal. Ich fand, dass, wenn eine Menge von Menschen, die versuchen, anmelden und registrieren, bekomme ich haufenweise Fehler über deadlocks auf UpdateUser, CheckPassword-und GetUser Funktionen dann ruft der server zu beschäftigt ist und weitere Anfragen starten, das timing.
Wenn ich schau dir in die gespeicherten Prozeduren, fand ich es ROWLOCK verwendet, auf 'UpdateUser'. Sind diese Dollen wodurch die deadlock? oder nur wählen, wäre die Folge ein deadlock?
Ich dachte über die Verwendung NOLOCK für meine situation, aber nach ein wenig recherche, scheinbar ist es nicht empfehlenswert...
- Was bedeuten die SQL-Befehle, die von Ihrem "UpdateUser, CheckPassword-und GetUser Funktionen" Aussehen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als barry bereits erläutert, sind diese beiden Hinweise können sich gegenseitig ergänzen, aber Sie werden in der Regel in unterschiedlichen Kontexten und zu lösen verschiedene Ressourcen-Konflikte Probleme.
WITH (NOLOCK) teilt dem server zu beschäftigen, die READ UNCOMMITTED-Isolationsstufe, das heißt, Sie sind dem Risiko ausgesetzt, dass Lesen kein commit ausgeführt wurde ("dirty") Zeilen später rollte zurück und haben somit nie existiert. Er verhindert classic deadlocks auf liest, aber auf Kosten der immer ungültige Daten.
Wenn es eine chance gibt GetUser oder CheckPassword Operationen Zugriff auf das Profil des Benutzers aktualisiert, die durch UpdateUser Betrieb, dann MIT (NOLOCK) wird nicht empfohlen.
WITH (ROWLOCK) Tabelle Hinweis kann verwendet werden, entweder in SELECT -, INSERT -, UPDATE-und DELETE-Anweisungen, um anzuweisen, den server bewerben sich nur ein Range-Lock(s) auf die Zeilen, die geändert oder Hinzugefügt, und zu vermeiden, eine Ausweitung der sperren auf Seiten-oder Tabellenebene. Die restlichen Zeilen sind nicht gesperrt und können aufgerufen werden, indem Sie eine andere Abfrage.
Allerdings, wenn die Standard-Isolationsstufe der Transaktion auf dem SQL Server-ist READ COMMITTED oder restriktiver, und die SNAPSHOT-LESEVORGÄNGE werden nicht aktiviert, dann wird ein aktiver INSERT -, UPDATE-oder DELETE-Transaktionen können immer noch block der SELECT-Abfrage, wenn lookup-Bedingungen übereinstimmen oder sich überschneiden.
verwenden Sie den Hinweis, wenn nur ein einzelnes oder nur ein paar Zeilen von der Abfrage betroffen, halten die Sperre aus sperren von Zeilen, die nicht gelöscht werden, indem Sie die Abfrage. Wollen Sie eine andere Abfrage Lesen unverknüpften Zeilen in der gleichen Zeit, anstatt zu warten, bis das löschen abgeschlossen ist.
Wenn Sie es auf einer Abfrage, löschen einer Menge von Zeilen, es kann sich verschlechtern die Leistung der Datenbank wird versuchen zu vermeiden, eine Ausweitung der sperren auf einen größeren Bereich, auch wenn es wäre effizienter gewesen.
WITH (NOLOCK) verwendet wird, mit SELECT-Anweisungen, wenn mal die Empfindlichkeit auf das abrufen von Daten bis auf die Mikrosekunde ist nicht eccential oder der Auswahl eines neu hinzugefügten Datensatz nach unten ist richtig.
WITH (ROWLOCK) wird von UPDATE-Anweisungen zu halten, die Verriegelung der Zeile auf Zeilen-Ebene sperren und nicht zu eskalieren, wenn es zu mehr als einer Zeile oder gar eine Tabelle zu sperren.
Sollten Sie immer beide in Sie select-und update-Anweisungen, so gut wie Sie brauchen, um richtig zu erstellen, Indizes, cache-repitive Daten so nicht zu rapid fire-Abfrage der Datenbank für die Daten, ändert sich wenig, und betrachten Sie Ihre login-Logik, um zu bestimmen, wenn es nicht der Durchführung notwendiger Protokollierung von Daten, und auch überprüfen Sie Ihre SQL-Fehler Protokolle für Fehler, die möglicherweise verlangsamen den Zugriff auf Ihre web-site.