Grundlegendes zu Multiversion Concurrency Control (MVCC) und Momentaufnahmen

Abgeschlossen

Die meisten Datenbankverwaltungssysteme (Database Management Systems, DBMS) verwenden Sperren, um Nebenläufigkeitssteuerung zu erzwingen. PostgreSQL ergänzt Sperren jedoch um einen alternativen Ansatz. PostgreSQL verwendet ein System namens Multiversion Concurrency Control (MVCC), mit dem mehrere Versionen derselben Zeile vorhanden sein können, um die Nebenläufigkeit zu verbessern. Bei diesem System wird für jede Abfrage eine frühere Momentaufnahme der Daten verwendet, die transaktional konsistent sind. MVCC stellt sicher, dass eine Transaktion, die Daten liest, keine Transaktion blockiert, die Daten schreibt, und umgekehrt.

Verbindung A führt beispielsweise eine Abfrage aus, die alle Zeilen einer Tabelle überprüft. Gleichzeitig führt Verbindung B eine Abfrage durch, die einige der Zeilen aktualisiert. Dank MVCC können beide Abfragen gleichzeitig ausgeführt werden, indem eine andere Version der betroffenen Zeilen erstellt wird. Auf diese Weise kann Verbindung B die Aktualisierungen ohne Auswirkungen auf Verbindung A ausführen. Dies wird erreicht, indem jede Zeilenversion einen xmin-Wert für die visible since-Transaktion und einen xmax-Wert für die visible until-Transaktion aufweist. Bei der Verwendung von MVCC ignoriert Verbindung A alle Änderungen, die nach dem Start der Abfrage von Verbindung A aufgetreten sind.

Diagramm zu Multi-Version Concurrency Control: Eine Leseabfrage, die die ursprünglichen Daten liest, und eine Schreibabfrage, die eine Momentaufnahme aktualisiert

Transaktionen

Transaktionen in einem DBMS sind eine atomare Arbeitseinheit. Daher wird die Transaktion entweder in ihrer Gesamtheit oder gar nicht committet. Transaktionen werden auch für Nebenläufigkeitszwecke verwendet. Mithilfe von Isolationsstufen kann die mögliche Auswirkung einer Transaktion auf andere, gleichzeitige Transaktionen definiert werden.

Sie beginnen eine Transaktion mit BEGIN TRANSACTION oder START TRANSACTION. Sie schließen eine Transaktion mit COMMIT ab, um alle in der Transaktion vorgenommenen Änderungen zu speichern, oder führen ROLLBACK aus, um alle von der Transaktion vorgenommenen Änderungen rückgängig zu machen. Beispiel:

BEGIN TRANSACTION;
    UPDATE production.workorder
        SET stockedqty=7
        WHERE workorderid=1;
COMMIT;