PostgreSQL und MVCC - Multiversion Concurrency Control

PostgreSQL verwendet MVCC (Multi-Version Concurrency Control) als Strategie für das Transaktiosmanagement. Das bedeutet, dass jeder Transaktion eine eigene Kopie des Momentanzustands der Datenbank zur Verfügung gestellt wird. Sie "sieht" alles, was vorangegangene Transaktionen geschrieben haben, aber nicht, was parallele Transaktionen ändern, solange sie noch nicht beendet sind. Auf diesem Schnappschuss kann sie ihre Modifikationen durchführen. Am Ende der Transaktion werden die Änderungen mit einem COMMIT in die Datenbank geschrieben.

Alle aktualisierten Zeilen einer Tabelle sind deshalb in mehreren Versionen gespeichert. Jedesmal, wenn eine Zeile aktualisiert wird, wird tatsächlich eine neue Zeile in die Tabelle eingefügt und die veraltete Zeile markiert. Wenn Zeilen gelöscht werden, bleiben sie tatsächlich in der Tabelle stehen und bekommen eine Löschmarkierung. Hat die Tabelle Indexe, werden auch hier neue Zeilen eingefügt und veraltete oder gelöschte Zeilen markiert.

Der Grund: Verschiedene Versionen der Zeilen müssen so lange vorgehalten werden, bis keine ältere Transaktion sie mehr "sehen" kann.

Damit Tabellen nicht ins Unendliche wachsen, muß dies geprüft werden: Markierte Datensätze, die von keiner Transaktion mehr gesehen werden können, sogenannte dead tuples, müssen regelmäßig gelöscht werden.

Finden wenige Schreibzugriffe statt, dürfen die Zeitintervalle, nach denen die Datenbank aufgeräumt wird, länger sein, weil es wenige Versionen eines Datensatzes gibt. Entsprechend muss das Zeitintervall kürzer sein, wenn es hohe Schreibaktivitäten gibt.

Mehr dazu bei: