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 » Funktionsweise von Sperren » Positionssperren

 

Phantomsperren

Eine Phantomsperre, die auch als Anti-Einfügesperre bezeichnet wird, wird auf eine Scan-Position gesetzt, um das anschließende Erstellen von Phantomzeilen durch andere Transaktionen zu verhindern. Wenn eine Phantomsperre gesetzt wird, verhindert sie, dass andere Transaktionen eine Zeile in eine Tabelle unmittelbar vor der Zeile einfügen, für die eine Anti-Einfügesperre gesetzt wurde. Eine Phantomsperre ist eine langfristige Sperre, die bis zum Abschluss einer Transaktion aufrechterhalten wird.

Phantomsperren werden nur durch Transaktionen gesetzt, die auf Isolationsstufe 3 ausgeführt werden. Es handelt sich dabei um die einzige Isolationsstufe, die Konsistenz im Hinblick auf Phantome garantiert.

Für einen Index-Scan werden Phantomsperren für jede durch den Index gelesene Zeile gestzt, und am Ende des Index-Scans wird eine zusätzliche Phantomsperre gesetzt, um Einfügungen in den Index am Ende des entsprechenden Indexbereichs zu verhindern. Phantomsperren mit Index-Scans verhindern, dass Phantome durch das Einfügen neuer Zeilen in die Tabelle erstellt werden, oder dass ein indizierter Wert aktualisiert wird, der das Erstellen eines Indexeintrags an einer Stelle verursachen würde, die durch die Phantomsperre abgedeckt ist.

Bei einem sequenziellen Scan werden Phantomsperren für jede Zeile in einer Tabelle gesetzt, um zu verhindern, dass eine Einfügung die Ergebnismenge beeinflusst. Daher haben Scans der Isolationsstufe 3 oft negative Auswirkungen auf die Datenbankparallelität. Während eine oder mehrere Phantomsperren in Konflikt mit einer Einfügesperre stehen und eine oder mehrere Lesesperren in Konflikt mit einer Schreibsperre, gibt es zwischen Phantom-/Einfügesperren und Lese-/Schreibsperren keine Interaktion. Obwohl zum Beispiel eine Schreibsperre nicht für eine Zeile gesetzt werden kann, die eine Lesesperre enthält, kann sie für eine Zeile gesetzt werden, die lediglich über eine Phantomsperre verfügt. Dem Datenbankserver stehen aufgrund dieser flexiblen Anordnung mehrere Optionen offen, aber das bedeutet, dass der Server allgemein die zusätzliche Vorsichtsmaßnahme treffen muss, eine Lesesperre zu setzen, wenn er eine Phantomsperre setzt. Andernfalls könnte eine andere Transaktion die Zeile löschen.