Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 12.0.0 (Deutsch) » SQL Anywhere Server - SQL-Benutzerhandbuch » Transaktionen und Isolationsstufen verwenden » Isolationsstufen und Konsistenz

 

Snapshot-Isolation

Blockierungen und Deadlocks können auftreten, wenn Benutzer gleichzeitig dieselben Daten lesen bzw. schreiben. Die Snapshot-Isolation hat das Ziel, Parallelität und Konsistenz zu verbessern, indem unterschiedliche Datenversionen aufbewahrt werden. Wenn Sie die Snapshot-Isolation in einer Transaktion verwenden, liefert der Datenbankserver auf alle Leseanforderungen eine festgeschriebene Version der Daten. Er tut dies, ohne Lesesperren zu setzen, und vermeidet Interferenzen mit Benutzern, die Daten schreiben.

Ein Snapshot ist eine Datenmenge, die in der Datenbank festgeschrieben wurde. Wenn Sie die Snapshot-Isolation verwenden, benutzen alle Abfragen innerhalb einer Transaktion die gleiche Datenmenge. Für Datenbanktabellen werden keine Sperren gesetzt, wodurch es anderen Transaktionen möglich ist, auf die Daten zuzugreifen und diese zu ändern. SQL Anywhere unterstützt drei Snapshot-Isolationsstufen, mit denen Sie steuern können, wann ein Snapshot aufgezeichnet wird:

  • snapshot   Benutzt einen Snapshot festgeschriebener Daten aus der Zeit, als die erste Zeile von der Transaktion gelesen, eingefügt, aktualisiert oder gelöscht wurde.

  • statement-snapshot   Benutzt einen Snapshot der festgeschriebenen Daten von dem Zeitpunkt, zu dem die erste Zeile von der Anweisung gelesen wird. Jede Anweisung innerhalb der Transaktion sieht einen Snapshot von Daten von einem anderen Zeitpunkt.

  • readonly-statement-snapshot   Für Nur-Lesen-Anweisungen wird ein Snapshot festgeschriebener Daten aus der Zeit benutzt, als die erste Zeile gelesen wurde. Jede Nur-Lesen-Anweisung innerhalb der Transaktion sieht einen Snapshot von Daten aus einer anderen Zeit. Benutzen Sie für Insert-, Update- und Delete-Anweisungen die Isolationsstufe, die mit der Option "updatable_statement_isolation" festgelegt wurde: 0 (Standardeinstellung), 1, 2 oder 3.

Sie können auch angeben, wann der Snapshot bei einer Transaktion beginnt, indem Sie die Anweisung BEGIN SNAPSHOT verwenden. Siehe BEGIN SNAPSHOT-Anweisung.

Snapshot-Isolation ist häufig sinnvoll, wie z.B. unter folgenden Umständen:

  • Anwendungen mit vielen Lesezugriffen und wenigen Aktualisierungen   Snapshot-Transaktionen setzen Schreibsperren nur für Anweisungen, welche die Datenbank ändern. Wenn eine Transaktion hauptsächlich Lesezugriffe durchführt, setzt die Snapshot-Transaktion keine Lesesperren, die zu Interferenzen mit den Transaktionen anderer Benutzer führen könnten.

  • Anwendungen mit lang dauernden Transaktionen, während andere Benutzer auf Daten zugreifen müssen   Snapshot-Transaktionen setzen keine Lesesperren, wodurch andere Benutzer die Daten lesen und aktualisieren können, während der Snapshot durchgeführt wird.

  • Anwendungen, die eine konsistente Datenmenge aus der Datenbank lesen müssen   Da ein Snapshot eine festgeschriebene Datenmenge eines bestimmten Zeitpunkts zeigt, können Sie die Snapshot-Isolation benutzen, um konsistente Daten zu erhalten, die sich während der Transaktion nicht verändern, sogar wenn andere Benutzer die Daten ändern, während Ihre Transaktion ausgeführt wird.

Die Snapshot-Isolation wirkt sich nur auf Basistabellen und globale temporäre Tabellen aus, die von allen Benutzern gemeinsam genutzt werden. Ein Lesezugriff auf einen anderen Tabellentyp liefert niemals eine alte Version der Daten und initiiert niemals einen Snapshot. Eine Aktualisierung eines anderen Tabellentyps initiiert nur dann einen Snapshot, wenn die Option "isolation_level" auf "snapshot" gesetzt wurde und die Aktualisierung eine Transaktion initiiert.

Die folgenden Anweisungen können nicht ausgeführt werden, wenn mit der WITH HOLD-Klausel geöffnete Cursor vorhanden sind, die entweder Anweisungs- oder Transaktions-Snapshots verwenden:

Wenn Cursor mit der WITH HOLD-Klausel geöffnet werden, ist ein Snapshot von allen Zeilen sichtbar, die zur Snapshot-Startzeit festgeschrieben wurden. Ebenfalls sichtbar sind alle Änderungen, die von der aktuellen Verbindung seit dem Start der Transaktion, innerhalb der der Cursor geöffnet war, abgeschlossen wurden.

TRUNCATE TABLE ist nur erlaubt, wenn eine schnelle Kürzung nicht durchgeführt wird, weil in diesem Fall einzelne DELETE-Anweisungen im Transaktionslog aufgezeichnet werden. Siehe TRUNCATE-Anweisung.

Falls eine dieser Anweisungen aus einer Nicht-Snapshot-Transaktion durchgeführt wird, werden bereits laufende Snapshot-Transaktionen, die danach die Tabelle benutzen, einen Fehler erhalten, der angibt, dass sich das Schema geändert hat.

Die Übereinstimmungsprüfung von materialisierten Ansichten vermeidet die Verwendung einer Ansicht, wenn sie nach dem Start des Snapshots für eine Transaktion aktualisiert wurde.

Snapshot-Isolationsstufen werden in allen Programmierschnittstellen unterstützt. Sie können die Isolationsstufe mit der Anweisung SET OPTION einstellen. Informationen zur Snapshot-Isolation finden Sie unter:

 Zeilenversionen
 Einführung in Snapshot-Transaktionen

Snapshot-Isolation aktivieren
Beispiel einer Snapshot-Isolation
Aktualisierungskonflikte und Snapshot-Isolation