1

Ich kenne die Theorie, dass die Lese mit Bereichssperren & die Schreibsperren für die Dauer der Transaktion in einer serialisierbaren Isolationsstufe gehalten werden. Ich kann jemanden verstehen, der eine Erklärung abgibt. "Da alle Dinge gleich sind, kann die serielle Isolierung MAI, ABER NICHT NOTWENDIG, zu weniger Parallelität führen als auf jeder anderen Isolationsstufe." Aber wie alle Blogs/Dokumente es angeben, scheint eine geringere Nebenläufigkeit und ein höherer Stillstand eine Gewissheit zu sein. Ich versuche zu verstehen, warum es in meinem konkreten Fall praktisch so sein sollte. Hier sind Fragen, die ich habeWarum führt eine serialisierbare Isolationsstufe zu Deadlock- und Concurrency-Problemen?

  1. Sollte eine serializable Isolationsstufe niedriger Parallelität führen, wenn die verschiedenen Verbindungen nicht den gleichen Satz von Aufzeichnungen zugreifen? Ich nehme ein "fein abgestimmtes" OLTP-System an, bei dem jede Abfrage eine "Punktabfrage" ist, die nur wenige Zeilen zurückgibt und der Optimierer große Pläne hat. Ich denke auch an Datenseiten und nicht an die Indexseiten.

  2. Warum würden die Deadlocks zunehmen? Sind diese auf die Aktualisierungen der Indexseiten zurückzuführen? Aber diese können auf jeder Isolationsstufe auftreten, abgesehen von einer Snapshot-Isolation. Also warum sollte man die serialisierbare Isolationsebene aussortieren?

Ich werde natürlich die Antwort nehmen die sagt: ‚Sie nie wissen, wann Sie Ihre Ausführungspläne schlecht basierend auf Benutzereingaben gehen. Sie machen eine schlechte Situation schlimmer, indem Sie eine höhere als die erforderliche Isolationsstufe einstellen. Stellen Sie also die höchste Isolationsstufe ein, die am besten für Sie funktioniert.

Antwort

1

Die kurze Antwort ist, dass Sie am Ende mehr und verschiedene Arten von Sperren herausnehmen, wie Sie von read uncommitted bis hin zu serializable gehen. Und auf einer bestimmten Ebene macht es Sinn; Wie sonst könnte die Datenbank-Engine folgende Garantie geben?

Andere Transaktionen können keine neuen Zeilen mit Schlüsselwerten einfügen, die in den Bereich von Schlüsseln fallen, die von Anweisungen in der aktuellen Transaktion gelesen werden, bis die aktuelle Transaktion abgeschlossen ist.

Weiter unten in der Dokumentation heißt es direkt, dass Bereichssperren herausgenommen werden. Also, wenn Sie so etwas wie select * from dbo.yourTable where ID between 1 and 50 tun, und es gibt derzeit nur 10 Zeilen in der Tabelle (sagen IDs 1-10), die Anwendung nicht in der Lage sein wird:

  • für IDs keine Daten einfügen 11-50
  • Löschen/aktualisieren alle 1-10

Wenn Sie es benötigen, müssen Sie es. Aber wissen Sie, worauf Sie hinauswollen; Die freigegebenen Bereichssperren, die platziert werden, sind inkompatibel (lesen Sie "wird Blockierung verursachen") mit vielen Dingen. Vollständige Details finden Sie unter the Lock Compatibility Matrix.

+0

Ich würde sicherlich mit Ihnen einverstanden sein, wenn die Verbindungen Abstand Sperren nehmen. Aber antwortest du immer noch gut, wenn es für 2 verschiedene Benutzerverbindungen selten wäre, auf den exakt gleichen Datensatz/Seite zuzugreifen? – QFirstLast

+0

Mit Bereichssperren sperren Sie eine Metastruktur. Das heißt, die Daten müssen nicht einmal für eine Operation existieren, die versucht, sie zu ändern, um sie zu blockieren (siehe die obigen Aufzählungspunkte). Wenn Sie also wissen, dass Ihre zwei (oder mehr) Anwendungen disjunkte Bereiche ändern werden, dann sind Sie gut. Aber ich würde widersprechen mit: Warum würden Sie an diesem Punkt serialisierbare Isolierung benötigen? –

+0

Danke Ben. In Bezug auf "warum würden Sie zu diesem Zeitpunkt eine serialisierbare Isolierung benötigen?" Haben wir noch keine Entscheidung getroffen.Wir sind dabei, die Eigenschaften, Vor- und Nachteile jeder Isolationsstufe zu verstehen und sie auf unsere Situation anzuwenden. Deine Antwort hat geholfen. Ich werde versuchen, Ihre Antwort als Antwort zu markieren. Das letzte Mal, als ich es versuchte, ließ mich die Seite nicht sagen "Ich brauchte einige x Punkte, bevor ich das tun konnte". – QFirstLast

Verwandte Themen