Remote-Abfragen auf SNAPSHOT-Isolationsstufe

9

Ich experimentiere mit der Snapshot-Isolationsstufe. Immer wenn ich versuche, auf einen Verbindungsserver zuzugreifen, wird folgende Fehlermeldung angezeigt:

Der Fernzugriff wird für die Transaktionsisolationsstufe "SNAPSHOT" nicht unterstützt.

Ich konnte in BOL oder Google zu diesem Thema nichts Sinnvolles finden.

Die Einschränkung scheint ziemlich frustrierend. Gibt es eine andere Problemumgehung als das lokale Zwischenspeichern aller Remote-Daten?

VladV
quelle

Antworten:

9

Wenn Sie sich mit den Interna der Implementierung der Snapshot-Isolation in SQL Server befassen, wird klar, warum der Remotezugriff nicht unterstützt wird.

Wenn die Snapshot-Isolation aktiviert ist, werden bis zu 14 Byte Versionsinformationen an jede geänderte Zeile angehängt. Die zusätzlichen Bytes enthalten die Transaktionssequenznummer der Transaktion, die die Zeile geändert hat, sowie einen Zeiger auf die versionierte Zeile in tempdb.

Bei einer Transaktion, die bei der Snapshot-Isolation ausgeführt wird, wird die Version einer Zeile angezeigt, die zum Zeitpunkt des Starts vorhanden war (die zum Zeitpunkt der Ausführung der ersten Anweisung vorhanden war und nicht BEGIN TRAN). Es ist die Transaktionssequenznummer, mit der die richtige Version im Versionsspeicher identifiziert wird. Da es keine Korrelation zwischen den Sequenznummern auf Ihrem lokalen und dem Remote-Server gibt, kann der Remote-Server die richtige Version nicht abrufen.

Es gibt zweifellos Möglichkeiten, wie eine SQL Server-zu-SQL Server-Verbindung dieses erste Problem lösen kann, falls das SQL-Entwicklungsteam entscheidet, dass es sich lohnt, dies zu tun. Es gibt jedoch ein zweites Problem: Wie würden Sie mit dem Entfernen von Versionen aus dem Versionsspeicher umgehen?

Der für die Bereinigung verantwortliche Hintergrundprozess ermittelt anhand der Transaktionssequenznummer erneut, ob noch eine Zeilenversion erforderlich ist. Dies erfordert lediglich die Identifizierung der ältesten laufenden Transaktionssequenznummer und das Entfernen aller älteren Versionen. Mit einer Remote-Verbindung ... klingt hässlich, weshalb es nicht unterstützt wird.

Könnte ein anderer Ansatz gewählt werden, vielleicht die Durchsetzung REPEATABLE READoder SERIALIZABLEdie Remote-Verbindung? Nein, nicht ohne die Konsistenz zu beeinträchtigen, da die Zeile auf dem Remote-Server zum Zeitpunkt des Starts Ihrer lokalen Transaktion nicht gesperrt werden konnte. Sie konnten sich nicht auf das Verhalten verlassen und die ACID-Konformität beeinträchtigen.

Ressourcennutzung bei der Zeilenversionierung und SQL Server 2005 Zeilenversionsbasierte Transaktionsisolation enthalten die meisten wichtigen Details.

Wie Sie dies am besten umgehen können, hängt davon ab, was Sie erreichen möchten. Wenn Sie Ihr spezifisches Szenario erweitern können, können wir die alternativen Ansätze untersuchen.

Mark Storey-Smith
quelle
Danke für die Erklärung. Es ist unwahrscheinlich, dass die Remote-Daten geändert werden. In diesem Fall reicht also nur eine Isolationsstufe aus. Ich habe versucht, Hinweise wie (readcommitted) oder (nolock) für die Remote-Tabelle anzugeben, habe aber den gleichen Fehler erhalten.
VladV
Können Sie vor dem Starten der lokalen Snapshot-Transaktion lesen, ob die Remote-Daten nicht geändert werden und Sie eine niedrigere Isolationsstufe akzeptieren können?
Mark Storey-Smith
Ja, sicher kann ich zuerst die entfernten Daten lesen und danach die Snapshot-Transaktion starten. Ich hatte gehofft, das zu vermeiden, weil es den Code komplizierter macht.
VladV