it-swarm.com.de

Festgelegte Snapshot-VS-Snapshot-Isolationsstufe lesen

Könnte mir jemand bitte helfen zu verstehen, wann SNAPSHOT-Isolationsstufe über READ COMMITTED SNAPSHOT in SQL Server verwendet wird?

Ich verstehe, dass in den meisten Fällen READ COMMITTED SNAPSHOT funktioniert, aber nicht sicher ist, wann SNAPSHOT-Isolation verwendet wird.

Vielen Dank

63
user173552

READ COMMITTED SNAPSHOT liest optimistisch und pessimistisch. Im Gegensatz dazu führt SNAPSHOT optimistische Lesevorgänge und optimistische Schreibvorgänge aus.

Microsoft empfiehlt READ COMMITTED SNAPSHOT für die meisten Apps, für die Zeilenversionen erforderlich sind.

Lesen Sie diesen ausgezeichneten Microsoft-Artikel: Auswahl der auf Versionierung basierenden Isolationsstufen . Es erläutert die Vorteile und Kosten beider Isolationsstufen. 

Und hier ist eine gründlichere: http://msdn.Microsoft.com/en-us/library/ms345124(SQL.90).aspx

70
Bill Paetzke

 enter image description here [! [Isolation Level Table] [2]] [2]

Siehe das Beispiel unten:

Festgelegte Momentaufnahme lesen

Ändern Sie die Datenbankeigenschaft wie folgt

ALTER DATABASE SQLAuthority
SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE
GO

Session 1

USE SQLAuthority
GO
BEGIN TRAN
UPDATE DemoTable
SET i = 4
WHERE i = 1

Sitzung 2

USE SQLAuthority
GO
BEGIN TRAN
SELECT *
FROM   DemoTable
WHERE i = 1

Ergebnis - Die Abfrage in Sitzung 2 zeigt den alten Wert (1, EINS), da die aktuelle Transaktion NICHT festgeschrieben ist. Auf diese Weise vermeiden Sie auch das Sperren und Lesen von festgeschriebenen Daten.

Session 1

COMMIT

Sitzung 2

USE SQLAuthority
GO
SELECT *
FROM   DemoTable
WHERE i = 1

Ergebnis - Die Abfrage in Sitzung 2 zeigt keine Zeilen, da die Zeile in Sitzung 1 aktualisiert wird. Wiederum sehen wir festgeschriebene Daten.

Snapshot Isolation Level

Dies ist die neue Isolationsstufe, die ab SQL Server 2005 verfügbar war. Für diese Funktion ist eine Änderung in der Anwendung erforderlich, da eine neue Isolationsstufe verwendet werden muss.

Ändern Sie die Datenbankeinstellung mit unten. Wir müssen sicherstellen, dass sich keine Transaktion in der Datenbank befindet.

ALTER DATABASE SQLAuthority SET AllOW_SNAPSHOT_ISOLATION ON

Jetzt müssen wir auch die Isolationsstufe der Verbindung ändern, indem Sie unten verwenden

Session 1

USE SQLAuthority
GO
BEGIN TRAN
UPDATE DemoTable
SET i = 10
WHERE i = 2

Sitzung 2

SET TRANSACTION ISOLATION LEVEL SNAPSHOT
GO
USE SQLAuthority
GO
BEGIN TRAN
SELECT *
FROM   DemoTable
WHERE i = 2

Ergebnis: Selbst wenn wir den Wert auf 10 geändert haben, wird der alte Datensatz in Sitzung 2 (2, ZWEI) noch angezeigt.

Lassen Sie uns nun die Transaktion in Sitzung 1 festschreiben

Session 1

COMMIT

Kommen wir zurück zu Sitzung 2 und führen Sie select erneut aus.

Sitzung 2

SELECT *
FROM   DemoTable
WHERE i = 2

Der Datensatz wird weiterhin angezeigt, da in Sitzung 2 die Transaktion mit Snapshot-Isolation angegeben wurde. Wenn wir die Transaktion nicht abschließen, wird der letzte Datensatz nicht angezeigt.

Sitzung 2

COMMIT
SELECT *
FROM   DemoTable
WHERE i = 2

Jetzt sollten wir die Zeile nicht sehen, da sie bereits aktualisiert wurde.

Siehe: SQL Authority , Safari Books Online

26
Akira Yamamoto

Kein Vergleich von Snapshot und Snapshot Read Committed ist ohne die Besprechung der gefürchteten Ausnahme des Snapshot-Aktualisierungskonflikts, die in Snapshot auftreten kann, abgeschlossen, jedoch nicht mit Snapshot Read Committed. 

Kurz gesagt: Die Snapshot-Isolation ruft beim Start einer Transaktion einen Snapshot der festgeschriebenen Daten ab und verwendet dann optimistisches Sperren für Lese- und Schreibvorgänge. Wenn beim Versuch, eine Transaktion festzuschreiben, sich herausstellt, dass etwas anderes dieselben Daten geändert hat, führt die Datenbank einen Rollback der gesamten Transaktion durch und es wird ein Fehler ausgelöst, der zu einer Ausnahmebedingungskonfliktauslösung im aufrufenden Code führt. Dies liegt daran, dass die Version der von der Transaktion betroffenen Daten am Ende der Transaktion nicht dieselbe ist wie zu Beginn.

Snapshot Read Committed leidet nicht unter diesem Problem, da das Sperren von Schreibvorgängen (pessimistische Schreibvorgänge) verwendet wird und Snapshot-Versionsinformationen aller festgeschriebenen Daten in der Stat von jeder Anweisung abgerufen werden. 

Die Möglichkeit, dass Snapshot-Aktualisierungskonflikte in Snapshot und NOT Snapshot Read Committed auftreten, ist ein äußerst signifikanter Unterschied zwischen den beiden.

3
user3444696

Immer noch relevant, beginnend mit Bills Kommentaren las ich mehr und machte Notizen, die für andere nützlich sein könnten.

Standardmäßig funktionieren Einzelanweisungen (einschließlich "SELECT") für "festgeschriebene" Daten (READ COMMITTED). Die Frage lautet: Warten sie, bis die Daten "inaktiv" sind und verhindern, dass andere beim Lesen arbeiten?

Einstellung über Rechtsklick DB "Eigenschaften -> Optionen -> Sonstiges":

Parallelität/Blockieren: Wird gelesen Committed Snapshot On [Defaults aus, sollte an sein]:

  • Verwenden Sie SNAPSHOT zum Auswählen (Lesen), warten Sie nicht auf andere und blockieren Sie sie nicht.
  • Effektoperation ohne Codeänderung
  • ALTER DATABASE SET READ_COMMITTED_SNAPSHOT [ON | OFF]
  • SELECT Name, is_read_committed_snapshot_on FROM sys.databases

Konsistenz: Snapshot-Isolation zulassen [Standardeinstellungen aus, debattierbar - OK aus]:

  • Erlauben Sie dem Client, SNAPSHOT über SQL-Anweisungen (Transaktionen) anzufordern.
  • Code muss "Transaktions-Momentaufnahmen" anfordern (wie SET TRANSACTION ...)
  • ALTER DATABASE SET ALLOW_SNAPSHOT_ISOLATION [ON | OFF]
  • SELECT Name, is_read_committed_snapshot_on FROM sys.databases

Zur Frage: Es ist nicht eine oder die andere zwischen Read Committed Snapshot und Allow Snapshot Isolation. Es handelt sich um zwei Fälle von Snapshot, die entweder unabhängig voneinander ein- oder ausgeschaltet sein können, wobei die Snapshot-Isolation zulassen ein etwas fortgeschritteneres Thema ist. Die Snapshot-Isolation zulassen ermöglicht es dem Code, Snapshot-Land weiter zu steuern.

Das Problem scheint klar zu sein, wenn Sie über eine Zeile nachdenken: Das System hat standardmäßig keine Kopie, so dass ein Leser warten muss, wenn andere schreiben, und ein Verfasser muss auch warten, wenn andere lesen - die Zeile muss alle sperren Zeit. Durch Aktivieren der Option "Ist Committed Read Snapshot On" aktiviert, aktiviert die Datenbank "Snapshot-Kopien", um diese Sperren zu vermeiden.

Wandern auf ...

Meiner Meinung nach sollte "Read Committed Snapshot On" für alle normalen MS SQLServer-Datenbanken "TRUE" sein, und es ist eine vorzeitige Optimierung, dass standardmäßig "FALSE" ausgeliefert wird.

Mir wurde jedoch gesagt, dass sich die eine Zeilensperre nicht nur dadurch verschlechtert, dass Sie möglicherweise mehrere Zeilen über Tabellen hinweg adressieren, sondern dass in SQL Server Zeilensperren mithilfe von Sperrsperren (Sperren von zufälligen Zeilen, die durch Speichernähe verbunden sind) implementiert werden Es gibt einen Schwellenwert, bei dem mehrere Sperren das Sperren von Tabellen auslösen - vermutlich optimistischere Leistungsoptimierungen, bei denen die Gefahr besteht, dass Probleme in stark ausgelasteten Datenbanken blockiert werden.

0
Cris Mooney