Datenbankkonsistenz ist ebenfalls einer der wichtigen Indikatoren zur Messung der DBMS-Leistung. Derzeit verwenden die meisten kommerziellen Datenbanken (DB2, SQL Server) das Two-Phase Locking (2PL)-Protokoll für die Nebenläufigkeitskontrolle, das die Serialisierung gleichzeitiger Transaktionen sicherstellt. Allerdings muss 2PL alle Daten sperren, bevor es darauf lesen oder schreiben kann. In der Blockierungskompatibilitätsmatrix sind S-Sperren (Share Locks) und X-Locks (exklusive Locks) inkompatibel, sodass Transaktion 2, wenn Transaktion 1 eine Leseoperation auf Daten A (plus eine S-Sperre) durchführt und Transaktion 2 auf die Daten schreiben möchte (ein X-Lock hinzufügen), Transaktion 2 warten muss, bis Transaktion 1 die S-Sperre auf Daten A aufhebt, bevor sie fortfahren kann. Multi-Version Concurrency Control (MVCC) löst dieses Problem gut. In einem Multiversion-System erzeugt jede Schreibdaten eine neue Version, und die Leseoperation kann die entsprechende Version bei Bedarf lesen, sodass sich Lese- und Schreiboperationen nicht gegenseitig blockieren. MVCC erhöht die Nebenwahl, bringt aber auch den Speicheraufwand durch die Wartung mehrerer Versionen mit sich.
Die Microsoft SQL Server-Datenbank-Engine führt eine neue Implementierung der bestehenden Transaktionsisolationsebene ein – committed reads, die Snapshots auf Anweisungsebene mittels Zeilenversionierung bereitstellen. Die SQL-Server-Datenbank-Engine führt außerdem eine neue Ebene der Transaktionsisolation ein – Snapshots, die Transaktions-Snapshots bereitstellen, die ebenfalls Zeilenversionierung verwenden.
Die Einstellung der READ_COMMITTED_SNAPSHOT-Datenbankoption auf ON ermöglicht die Trennung von Zeilen mit Zeilenversionierung. Die Einstellung der ALLOW_SNAPSHOT_ISOLATION-Datenbank-Option auf AN aktiviert die Snapshot-Isolation. Wenn eine der beiden Optionen für die Datenbank aktiviert ist, verwaltet die Datenbank-Engine die Version jeder geänderten Zeile. Immer wenn eine Transaktion eine Zeile ändert, wird das Bild der Zeile vor der Änderung auf eine Seite im Versionsspeicher kopiert. Ein Versionsspeicher ist eine Sammlung von Datenseiten in tempdb. Wenn es mehrere Transaktionsänderungszeilen gibt, werden mehrere Versionen dieser Zeile in einer Versionskette verknüpft. Eine Leseoperation mittels Zeilenversionierung ruft die letzte Version jeder Zeile ab, die zum Zeitpunkt des Transaktions- oder Anweisungsstarts committiert wurde.
Anwendungen, die für SQL Server 2008 geschrieben oder neu bei SQL Server sind, implementieren die Isolation von Read-Commits mittels Zeilenversionierung, indem sie die Transaktionsisolationsstufe für Read Commits angeben, wenn die READ_COMMITTED_SNAPSHOT-Datenbankoption ON ist. Alle Lesungen betrachten die Reihenversion, die zu Beginn der Aussage gemacht wurde. Dies liefert einen Snapshot der Daten auf Statement-Niveau.
Für SQL Server geschriebene Anwendungen implementieren Snapshot-Isolation, indem sie das Snapshot-Transaktionsisolationsniveau angeben, wenn die ALLOW_SNAPSHOT_ISOLATION-Datenbankoption ON ist. Alle Reads in einer Snapshot-Transaktion sehen die Version der Zeile, die zum Zeitpunkt des Transaktionsstarts committiert wurde. Dies liefert einen Momentaufnahme der Daten auf Transaktionsebene.
Bei Transaktionen, die zeilenbasierte Isolationsstufen verwenden, fordern Reads keine gemeinsamen Sperren für die Daten an. Das bedeutet, dass Leser, die Zeilenversionierung verwenden, andere Leser oder Autoren nicht daran hindern, auf dieselben Daten zuzugreifen. Ebenso steht der Autor dem Leser nicht im Weg. Allerdings stehen Autoren einander im Weg (selbst wenn sie auf einem Isolationsniveau basierend auf Reihenversionierung spielen). Zwei Schreiboperationen können dieselben Daten nicht gleichzeitig ändern.
Die Funktion Snapshot Isolation erweitert das Sperrrahmen in SQL Server 2008, indem Anwendungen Werte anzeigen können, bevor Datenänderungen erfolgen. Dies verhindert, dass die Anwendung gesperrt wird, während tatsächlich eingereichte Daten weiterhin bereitgestellt werden. Der Read Committed Snapshot von SQL Server 2008 erfordert die Aktivierung durch Datenbankadministrator, sodass Daten durch schreibgeschützte Transaktionen gelesen werden können. Die Nebenläufigkeitskontrolle von SI bei Schreib-nur-Transaktionen ist also sehr gut, aber es ist unklar, ob dies bei Update-Transaktionen der Fall ist. Es ist ungünstiger, dass langfristige Update-Transaktionen mit kurzfristigen High-Level-Transaktionen konkurrieren. Wenn eine Transaktion zwischen Datenbanken versucht, den Snapshot Isolation (SI)-Standard anstelle aller Datenbanken zu verwenden, schlägt die Transaktion fehl. Dies schafft zweifellos gewisse Hindernisse für die Skalierbarkeit. Es scheint, dass Microsoft noch einen langen Weg vor sich hat, um ein eigenes SI zu erreichen, das stärker ist als die SQL-92-Spezifikation.
Vor jeder Änderung wird eine Kopie der vorherigen Version erstellt, und alle nachfolgenden Leseoperationen lesen die kopierte Version aus, wobei die Änderung eine neue Version erstellt. Auf diese Weise,Lese- und Schreiboperationen blockieren sich nicht gegenseitig. Der Vorteil dieses Zeilenversionierungsmechanismus ist, dass die Nebenläufigkeit des Programms relativ hoch ist, aber der Nachteil ist, dass der Benutzer zwar keine unscharfen Daten liest, es sich aber um einen geänderten Datenwert handeln kann und kurz vor dem Ablauf steht. Wenn du die Daten basierend auf diesem abgelaufenen Wert modifizierst, führt das zu einem logischen Fehler。
SQL-Befehle:
Referenzlinks:
Der Hyperlink-Login ist sichtbar.
Der Hyperlink-Login ist sichtbar.
Der Hyperlink-Login ist sichtbar.
Der Hyperlink-Login ist sichtbar.
Der Hyperlink-Login ist sichtbar.
Der Hyperlink-Login ist sichtbar.
|