Welche Risiken gibt es, wenn wir in sql-server read commit snapshot aktivieren?

70

Ich habe hier gelesen , dass einige zusätzliche Daten pro Zeile gespeichert werden, sodass möglicherweise eine Leistungsverschlechterung auftritt. Welche anderen Risiken bestehen jedoch?

z.B. Beeinflusst dies die Wiederherstellung der Datenbank? Müssen wir noch etwas tun, um dies auszunutzen?

Ich plane, diese Befehle auszuführen:

ALTER DATABASE DatabaseName SET READ_COMMITTED_SNAPSHOT ON
ALTER DATABASE DatabaseName SET ALLOW_SNAPSHOT_ISOLATION ON

Ich glaube, dies wird uns etwas näher bringen, wo, wenn eine Transaktion andere Transaktionen aktualisiert, die alten Daten noch gelesen werden können. Ist das richtig?

Ich untersuche dies, weil ich Probleme mit dem Sperren von SQL Server 2005 habe. Ich hoffe, dass dies die gelegentlichen Deadlocks, die unsere Benutzer sehen, verringert, die Gesamtleistung unserer Anwendung verbessert und unsere Entwickler dazu ermutigt, mehr als einen Vorgang pro Transaktion ohne zu tun Angst.

Adam Butler
quelle

Antworten:

48

Zusammenfassung

  1. Wenn Sie Probleme beim Sperren haben, haben Sie ein Problem mit Ihrem Code: Es ist nicht das Datenbankmodul
  2. Es ist kein Wundermittel
  3. Sie können weitere Probleme hinzufügen

Belastung

Es erhöht auch die Belastung Ihrer Tempdb und CPU . Siehe auch:

Sicherheit

Vor allem sind Snapshot-Isolierungen in vielen Fällen standardmäßig nicht sicher . Lesen Sie "Snapshot-Isolation" (Wikipedia), um mehr über Write-Skew-Anomalien zu erfahren. Der nächste Abschnitt ist "Serialisierung der Snapshot-Isolierung", um dies zu umgehen.

Im Allgemeinen stellt die Snapshot-Isolation den Benutzer vor das Problem, nicht-triviale Einschränkungen beizubehalten, da er möglicherweise weder die potenziellen Fallstricke noch die möglichen Lösungen einschätzt. Der Vorteil dieser Übertragung ist eine bessere Leistung.

Siehe auch:

gbn
quelle
35

Ich weiß, dass dies ein alter Thread ist, aber ich würde zu einem großen Teil sagen, dass Schnappschussisolation ein Wundermittel ist . Dadurch werden alle Blockaden zwischen Lesern und Schreibern beseitigt . Es wird jedoch nicht verhindern, dass Schriftsteller andere Schriftsteller blockieren. Daran führt kein Weg vorbei.

Nach meiner Erfahrung ist die zusätzliche Belastung der TEMPDB vernachlässigbar und die Vorteile der Zeilenversionierung bei der Reduzierung blockierter Leser sind enorm.

Als Referenz: Die Zeilenversionierung (Snapshot-Isolation) ist die Methode, die Oracle seit Jahrzehnten verwendet, um die Isolation zu erreichen, ohne die Leser zu blockieren. Bei den Oracle-DBs, an denen ich seit fast 20 Jahren arbeite, treten weitaus weniger Blockierungsprobleme auf als bei SQL Server. Die meisten SQL-Entwickler zögern jedoch, die Snapshot-Isolierung zu verwenden, da sie ihren Code nur mit Datenbanken getestet haben, die die Standardeinstellung verwenden.

Futter
quelle
26

Einige zusätzliche Punkte, die zu den anderen Antworten hinzugefügt werden sollten:

SET ALLOW_SNAPSHOT_ISOLATION ONAktiviert nur die Snapshot-Isolation in einer Datenbank. Um dies zu nutzen, müssen Sie SET TRANSACTION ISOLATION LEVEL SNAPSHOTdie Transaktionen, auf die Sie sie anwenden möchten , neu codieren . Der aufrufende Code muss geändert werden, um Aktualisierungskonfliktfehler zu behandeln.

Danach verwenden SET READ_COMMITTED_SNAPSHOT ONAnweisungen bei read commit die Zeilenversionierung. Beachten Sie, dass dies eine Zeilenversionierung auf Anweisungsebene ist, die nur lesbar ist . Bei Aktualisierungen wird die "echte" Zeile abgerufen und Aktualisierungssperren angewendet. Weitere Informationen finden Sie im Abschnitt Zusammenfassung des Verhaltens unter Grundlegendes zu zeilenversionsbasierten Isolationsstufen

Auf beiden Wegen werden Sie ohne umfassende Tests wahrscheinlich eine völlig neue Reihe von Problemen in das System einführen.

Mark Storey-Smith
quelle
19

Ich glaube, dies wird uns etwas näher bringen, wo, wenn eine Transaktion andere Transaktionen aktualisiert, die alten Daten noch gelesen werden können. Ist das richtig?

Ja, das ist richtig .

Es lohnt sich, die Links in der Antwort von gbn zu lesen, und ich glaube, dass dies auch für das Standard-MVCC von Oracle gilt, wie für SQL Server im Snapshot-Isolationsmodus. Ich würde hinzufügen, dass, wenn Sie die potenziellen Fallstricke verstehen, die Vorteile der IMO die zusätzlichen Schwierigkeiten bei weitem überwiegen (aus Oracle-Sicht gesehen) - und natürlich einige Schließprobleme legitimerweise wegfallen, das ist der Punkt von MVCC (es gibt auch eine Klasse von) Sperrprobleme, die aufgrund von Codeproblemen nicht behoben werden, aber ich gehe davon aus, dass Sie dies verstehen.

Jack Douglas
quelle
9

Wir verwenden SNAPSHOT ISOLATION in all unseren Projekten, die SQL Server DB verwenden. Keine 1205 SQL-Fehler mehr, die nicht auf falschen Anwendungscode zurückzuführen sind, sondern auf Standardseiten- und Zeilensperrverhalten.

Die Auswirkungen auf die Leistung sind minimal und bis jetzt sind sieben Jahre vergangen. Hunderte Millionen Vorgänge wurden in verschiedenen Systemen verarbeitet, ohne dass Probleme hinsichtlich der SNAPSHOT ISOLATION auftraten.

Situationen, in denen mehrere unterschiedliche Threads geschäftskritische Informationen in einer Zeile parallel aktualisieren, sind äußerst außergewöhnlich, und die Wahrscheinlichkeit, dass die SNAPSHOT ISOLATION die Ursache für ein Inkonsistenzproblem ist, liegt sehr nahe bei Null.

Wenn Sie ein OLTP-System haben, das eine einzelne Zeile basierend auf den aktuellen Zeilendaten in vielen Threads entwurfsgemäß aktualisiert, sind SNAPSHOTS in solchen Fällen natürlich nicht akzeptabel.

Alexander Nemsadze
quelle
-2

wir hatten es aktiv und eine seltsame ausgewählte SQL-Anweisung, die 4 ausführt, blockierte jemals die gesamte Datenbank, egal wie viele Kerne und alle. Durch Deaktivieren von RCSI wurde das behoben. Ich würde es einschalten, sobald Sie auf andere Deadlocks stoßen, nicht standardmäßig.

Krautmaster
quelle