Wie viele Versionen werden bei mehreren Aktualisierungen desselben Datensatzes in einer einzigen Transaktion gespeichert?

11

Laut MSDN-Artikel von Kimberly L. Tripp, Neal Graves '" SQL Server 2005 Row Versioning-Based Transaction Isolation"

  • "... Alle früheren Versionen eines bestimmten Datensatzes sind in einer verknüpften Liste verkettet. Bei Transaktionen mit langer Zeilenversion muss die Verknüpfung bei jedem Zugriff durchlaufen werden , um die transaktionskonsistente Version von zu erreichen die Reihe"

Dies ist im Abschnitt "Grundlegendes zur Zeilenversionierung" beschrieben, in dem sowohl die Abschnitte "Zeilenversionierung beim Lesen mit Zeilenversionierung" als auch "Zeilenversionierung bei der Snapshot-Isolation" beschrieben werden.

Das Beispiel der Zeilenversionierung aufgrund von Änderungen wird nur im Zusammenhang mit mehreren Aktualisierungen desselben Datensatzes durch mehrere Transaktionen (T1, T2, T3) nur in SNAPSHOT angegeben.

Wenn nur eine Transaktion einen Datensatz mehrmals aktualisiert (durch mehrere Anweisungen), werden dann mehrere Versionsspeicher gespeichert (verknüpft) oder nur der, der zum Zeitpunkt der Aufnahme des SNAPSHOT- "Bildes" erstellt wurde?

Nun, die Antwort auf diese Frage sollte sofort meine anderen anstehenden verwandten Fragen beantworten:

Fulproof
quelle

Antworten:

11

Wie viele Versionen werden bei mehreren Aktualisierungen desselben Datensatzes in einer einzigen Transaktion gespeichert?

Nur einer.

Die erste Aktualisierung der Zeile generiert eine Zeilenversion und sperrt ausschließlich die Zeile. Spätere Aktualisierungen derselben Zeile innerhalb derselben Transaktion generieren keine neuen Zeilenversionen.


Eine verknüpfte Liste von Zeilenversionen kann wie folgt erstellt werden:

  • Die Transaktion T1 in einer SNAPSHOT-Transaktion liest eine Zeile und sieht den Wert 'a'.

  • Die Transaktion T2 (unter einer beliebigen Isolationsstufe) aktualisiert den Wert von 'a' auf 'b' und schreibt fest. Dies generiert eine Zeilenversion für den Wert 'a'.

  • Die Transaktion T3 (unter einer beliebigen Isolationsstufe) aktualisiert den Wert von 'b' auf 'c' und schreibt fest. Dies erzeugt eine Zeilenversion für den Wert 'b'. Diese Zeilenversion ist mit der vorherigen Zeilenversion für 'a' verknüpft.

  • Die Transaktion T1 liest den Zeilenwert, indem die Verknüpfung von dem auf der aktuellen Seite ('c') gespeicherten Wert zur Zeilenversion 'b' und dann zurück zur Zeilenversion 'a' durchlaufen wird.

Zeilenversionen werden durch Datenänderungen generiert, unabhängig davon, ob eine Lesetransaktion vorhanden ist (auf einer beliebigen Isolationsstufe). Die Versionen werden möglicherweise nie benötigt, aber sie werden immer noch generiert - dieselbe verknüpfte Liste von Versionen wird auch ohne Transaktion T1 erstellt.

Paul White 9
quelle