SQL Server - Welche Isolationsstufe für nicht blockierende select-Anweisungen?


9

Ich habe eine lange laufende Transaktion (z. B. T1), die einige Löschvorgänge, Aktualisierungen und Einfügungen für eine Tabelle in SQL Server 2008 R2 ausführt. Gleichzeitig führt ein anderer Prozess regelmäßig ausgewählte Anweisungen aus dieser Tabelle aus.

Unter den Standardeinstellungen für die Isolation (READ COMMITTED, glaube ich?) Blockiert T1 die Ausführung von Select-Anweisungen, bis die Transaktion festgeschrieben oder zurückgesetzt wird.

Was ich sehen möchte, ist, dass die select-Anweisungen auch während der Transaktion mit konsistenten Daten funktionieren. Ich glaube, dass SNAPSHOT-Isolation helfen kann, bin mir aber nicht sicher, ob ich in die richtige Richtung gehe. Wäre dies die beste Isolationsstufe für diese Anwendung?

Zweitens habe ich keine Kontrolle über den Prozess, der die select-Anweisungen aufruft, aber ich habe Kontrolle über die .NET-Anwendung, die T1 aufruft. Wären Änderungen an der Isolationsstufe sowohl für die select-Anweisungen als auch für T1 erforderlich, oder würde es ausreichen, nur T1 als mit einer anderen Isolationsstufe zu markieren?

Antworten:


8

In einer idealen Welt hätten Sie zwei Möglichkeiten: SNAPSHOT und READ COMMITTED SNAPSHOT (RCSI). Stellen Sie sicher, dass Sie die Grundlagen der Transaktionsisolationsstufen verstehen , bevor Sie entscheiden, welche für Ihre Arbeitslast geeignet ist. Beachten Sie insbesondere die unterschiedlichen Ergebnisse, die Sie möglicherweise beim Wechsel zu RCSI sehen.

Dies klingt nach einer idealen Welt, da Sie keine Kontrolle über die Anwendung haben, die die select-Anweisungen generiert. In diesem Fall besteht Ihre einzige Option darin, RCSI für die betreffende Datenbank so zu aktivieren, dass die Auswahl automatisch RCSI anstelle von READ COMMITTED verwendet.


6

Richtig, verwenden Sie die SNAPSHOT-Isolation, um konsistente, festgeschriebene Daten zu erhalten, bevor die Transaktion gestartet wurde.

Die Isolation READ UNCOMMITTED (auch bekannt als NOLOCK-Hinweis) liest dirtz-inkonsistente Daten

Wenn Sie die SNAPSHOT-Isolierung aktivieren, wird sie für alle zukünftigen SELECTs wirksam. ALTER DATABASEIn diesem Fall führen Sie READ_COMMITTED_SNAPSHOT aus

Bearbeiten: Link + Zitat von ALTER DATABASE hinzugefügt (mein Fettdruck)

Aktiviert die Option Read-Committed Snapshot auf Datenbankebene. Wenn diese Option aktiviert ist, generieren DML-Anweisungen Zeilenversionen, auch wenn keine Transaktion die Snapshot-Isolation verwendet. Sobald diese Option aktiviert ist, verwenden die Transaktionen, die die isolierte Leseisolationsstufe angeben, die Zeilenversionierung anstelle der Sperrung. Wenn eine Transaktion auf der isolierten Leseisolationsstufe ausgeführt wird, sehen alle Anweisungen eine Momentaufnahme der Daten, wie sie zu Beginn der Anweisung vorhanden sind.

Und von der Verwendung von Snapshot Isolation (meine Fettdruck)

Die Datenbankoption READ_COMMITTED_SNAPSHOT bestimmt das Verhalten der Standardisolationsstufe READ COMMITTED, wenn die Snapshot-Isolation in einer Datenbank aktiviert ist. Wenn Sie READ_COMMITTED_SNAPSHOT ON nicht explizit angeben, wird READ COMMITTED auf alle impliziten Transaktionen angewendet. Dies führt zu demselben Verhalten wie das Setzen von READ_COMMITTED_SNAPSHOT OFF (Standardeinstellung). Wenn READ_COMMITTED_SNAPSHOT OFF aktiviert ist, verwendet das Datenbankmodul gemeinsam genutzte Sperren, um die Standardisolationsstufe zu erzwingen. Wenn Sie die Datenbankoption READ_COMMITTED_SNAPSHOT auf ON setzen, verwendet das Datenbankmodul standardmäßig die Zeilenversionierung und die Snapshot-Isolation, anstatt Sperren zum Schutz der Daten zu verwenden.

Also ja.

Durch Aktivieren von RCSI können Lesevorgänge konsistente Daten erhalten und nicht von Schreibern blockiert werden, die Read Committed weiterhin verwenden


4

Ich würde vorschlagen, dass Sie die folgende Frage und ihre Antworten lesen: Probleme beim Sperren der Datenbank? .

Das Finden der richtigen Isolationsstufe für die Verwendung auf Datenbankebene ist das schnellste, was Sie derzeit tun können, um dieses Problem zu beheben, da es jetzt schwierig ist, alle Anwendungen zu ändern, die die Datenbank berühren, und ihren Code zu ändern. Da Sie sagten "Ich habe keine Kontrolle über den Prozess, der die select-Anweisungen aufruft", besteht die schnellste Antwort darin, die Datenbank auf die Isolationsstufe "Read Committed Snapshot" zu schalten, damit Sie die Leseabfragen nicht berühren. Andernfalls müssen Sie die Snapshot-Isolationsstufe für die Sitzungen verwenden, in denen Daten während Ihrer großen Transaktionen gelesen werden.

Weitere Details zur Auswahl der richtigen: Auswählen von auf der Zeilenversionierung basierenden Isolationsstufen .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.