READ COMMITTED SNAPSHOT von SQL Server vs SNAPSHOT

23

Ich habe die Unterschiede zwischen der SQL Server- READ COMMITTED SNAPSHOTund der SNAPSHOTIsolationsstufe untersucht und bin auf die folgende Ressource gestoßen:

Auswählen von zeilenversionsbasierten Isolationsstufen

Für die meisten Anwendungen wird aus den folgenden Gründen empfohlen, die festgeschriebene Isolation mit Zeilenversionsverwaltung anstelle der Snapshot-Isolation zu lesen:

  • Es benötigt weniger Speicherplatz als die Snapshot-Isolierung.

  • Die Snapshot-Isolation ist anfällig für Aktualisierungskonflikte, die beim Lesen der festgeschriebenen Isolation mithilfe der Zeilenversionierung nicht zutreffen. Wenn eine Transaktion, die unter Snapshot-Isolation ausgeführt wird, Daten liest, die dann von einer anderen Transaktion geändert werden, führt eine Aktualisierung durch die Snapshot-Transaktion auf dieselben Daten zu einem Aktualisierungskonflikt, und die Transaktion wird beendet und ein Rollback ausgeführt. Dies ist kein Problem bei der durch Lesen festgeschriebenen Isolation mithilfe der Zeilenversionierung.

Ich bin etwas neu in diesen Themen, aber ich kann die beiden Punkte aus dem obigen Link nicht verstehen.

  1. Warum sollte der Tempdb-Raum für diese Modi unterschiedlich sein? Speichert einer mehr granulare Versionierung als der andere?

  2. Warum ist die Snapshot-Isolierung anfälliger für Aktualisierungskonflikte?

John Russell
quelle

Antworten:

18
  1. READ COMMITTED SNAPSHOTVerwendet nach jeder Anweisung einen neuen Snapshot. Das bedeutet, dass weniger Zeilenversionen am Leben bleiben. (Die Aussage, die Sie in den Dokumenten zitiert haben, ist leicht irreführend, da sie darauf hindeutet, dass dies immer der Fall ist - dies gilt nur für lang laufende SNAPSHOTTransaktionen.) Snapshot-Zeilenversionen werden beim Schreiben erstellt. Die Lesevorgänge haben keinen Einfluss darauf, was in tempdb geschrieben wird. Schriftsteller können unmöglich vorhersehen, welche Lesungen in Zukunft durchgeführt werden. Leser beeinflussen nur, was gelöscht werden kann.
  2. Wenn eine SNAPSHOTTransaktion T1in eine Zeile schreibt, T2die zwischen dem T1Start und T1dem Schreibversuch von einer anderen Transaktion geändert wurde , schlägt die Anweisung mit einem Aktualisierungskonfliktfehler fehl. Dies ist ein optimistisches Parallelitätsmodell. Mit READ COMMITTED SNAPSHOT T1würde warten, T2bis die X-Sperre in der Reihe aufgehoben ist und normal fortgesetzt wird.
usr
quelle
1
Ist es sicher zu sagen, dass SNAPSHOT nicht ausschließlich für Updates sperrt, sondern sich nur auf die Zeilenversionierung stützt?
John Russell
1
@ JohnRussell Es wird ausschließlich zur Unterstützung des Rollbacks gesperrt. Alle Schreibvorgänge müssen mit einem X-Lock versehen werden, damit die Zeile im Falle eines Rollbacks wiederhergestellt werden kann.
USR
0

Ein weiterer Unterschied zwischen Snapshot und Read Committed Snapshot ist der folgende.

  1. Schnappschuss

In der ersten Sitzung

SET TRAN ISOLATION LEVEL SNAPSHOT BEGINN TRAN SELECT * FROM TB1 ..... .....

In der zweiten Sitzung

Aktualisiere TB1 SET NAME = NAME + 'test' Wobei id = 1

In der ersten Sitzung

SELECT * FROM TB1 - Dies gibt den Wert name für ID = 1 zurück, nicht name + 'test' COMMIT TRAN

Im Snapshot mit festgeschriebenem Lesezugriff gibt die erste Auswahl in Sitzung 1 den Namen für id = 1 und die zweite Auswahl den Namen + 'test' zurück.

Bei der Snapshot-Isolation erstellt SQL SERVER zu Beginn der Transaktion einen Snapshot und liest diesen Snapshot während der gesamten Transaktion aus.

In Read Committed Snapshot wird der Snapshot für jede SELECT-Anweisung während der Transaktion erstellt.

Artashes Khachatryan
quelle