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

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - SQL-Benutzerhandbuch » Datenbanken erstellen » 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 aus der Zeit, als die erste Zeile von der Anweisung gelesen wurde. Jede Anweisung innerhalb der Transaktion sieht einen Snapshot von Daten aus einer anderen Zeit.

  • 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. Weitere Hinweise finden Sie unter 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. Weitere Hinweise finden Sie unter 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

Wenn Snapshot-Isolation für eine Datenbank aktiviert wird, fügt der Datenbankserver jedes Mal, wenn eine Zeile aktualisiert wird, eine Kopie der Originalzeile zu der Version hinzu und speichert sie in der temporären Datei. Die Zeileneinträge der Originalversion werden gespeichert, bis alle aktiven Snapshot-Transaktionen, die möglicherweise auf die Originalzeilenwerte zugreifen müssen, abgeschlossen sind. Eine Transaktion mit Snapshot-Isolation berücksichtigt nur festgeschriebene Werte. Wenn die Aktualisierung einer Zeile nicht festgeschrieben oder zurückgesetzt wurde, bevor eine Snapshot-Transaktion begann, muss die Snapshot-Transaktion in der Lage sein, auf den Originalzeilenwert zuzugreifen. Dies ermöglicht es Transaktionen, mithilfe der Snapshot-Isolation Daten zu betrachten, ohne Sperren für die zugrunde liegenden Tabellen einzurichten.

Die Datenbankeigenschaft "VersionStorePages" liefert die Anzahl der Seiten in der temporären Datei, die derzeit für die Versionsspeicherung benutzt wird. Um diesen Wert abzurufen, führen Sie die folgende Abfrage aus:

SELECT DB_PROPERTY ( 'VersionStorePages' );

Alte Zeilenversionseinträge werden entfernt, wenn sie nicht mehr benötigt werden. Alte Versionen von BLOBs werden in der Originaltabelle gespeichert, nicht aber in der temporären Datei, bis sie nicht mehr benötigt werden, und Indexeinträge für alte Zeilenversionen werden im Originalindex gespeichert, bis sie nicht mehr benötigt werden.

Informationen über den Umfang des freien Speicherplatzes in der temporären Datei erhalten Sie, indem Sie die Systemprozedur "sa_disk_free_space" verwenden. Weitere Hinweise finden Sie unter sa_disk_free_space-Systemprozedur.

Wenn ein Trigger ausgelöst wird, der Zeilenwerte aktualisiert, werden auch die Originalwerte dieser Zeilen in der temporären Datei gespeichert.

Wenn Sie Ihre Anwendung so einrichten, dass sie kürzere Transaktionen und Snapshots verwendet, wird der Bedarf an temporärem Speicherplatz reduziert.

Wenn Sie Probleme mit dem Anwachsen der temporären Datei haben, können Sie ein GrowTemp-Systemereignis einrichten. Damit legen Sie fest, welche Aktionen beim Erreichen einer bestimmten Größe der temporären Datei durchgeführt werden sollen. Weitere Hinweise finden Sie unter Systemereignisse verstehen.

Einführung in Snapshot-Transaktionen

Snapshot-Transaktionen setzen Schreibsperren für Aktualisierungen. Für eine Transaktion oder Anweisung, die einen Snapshot verwendet, werden jedoch niemals Lesesperren gesetzt. Daher blockieren Lesevorgänge keine Schreibvorgänge und umgekehrt, aber Schreibvorgänge können andere Schreibvorgänge blockieren, wenn sie versuchen, die gleichen Zeilen zu aktualisieren.

Beachten Sie, dass eine Transaktion zum Zweck der Snapshot-Isolation nicht mit der Anweisung BEGIN TRANSACTION beginnt. Stattdessen beginnt sie mit der ersten READ-, INSERT-, UPDATE oder DELETE-Anweisung innerhalb der Transaktion, abhängig von der Snapshot-Isolationsstufe, die für die Transaktion benutzt wird. Im folgenden Beispiel wird gezeigt, wann eine Transaktion für eine Snapshot-Isolation beginnt:

SET OPTION PUBLIC.allow_snapshot_isolation = 'On';
         SET TEMPORARY OPTION isolation_level = 'snapshot';
   SELECT * FROM Products; --transaction begins and the statement only 
                           --sees changes that are already committed
   INSERT INTO Products 
         SELECT ID + 30, Name, Description,
         'Extra large', Color, 50, UnitPrice, NULL
         FROM Products
         WHERE Name = 'Tee Shirt';
COMMIT; --transaction ends

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