Verstehen Sie die Mehrversions-Kontrolle der Gleichzeitigkeit (MVCC) und Momentaufnahmen
Die meisten Datenbankverwaltungssysteme (DBMS) verwenden Sperren, um parallele Kontrolle zu erzwingen, aber PostgreSQL ergänzt die Sperre mit einem alternativen Ansatz. PostgreSQL verwendet ein System namens Multi-Version Concurrency Control (MVCC), mit dem mehrere Versionen derselben Zeile vorhanden sind, um die Parallelität zu verbessern. Mit diesem System sieht jede Abfrage eine frühere Momentaufnahme der Daten, die transaktional konsistent ist. MVCC stellt sicher, dass eine Transaktion, die Daten liest, keine Transaktion blockiert, die Daten schreibt und umgekehrt.
Beispielsweise führt Connection A eine Abfrage aus, die alle Zeilen einer Tabelle durchsucht. Gleichzeitig führt Connection B eine Abfrage aus, die einige der Zeilen aktualisiert. MVCC ermöglicht es beiden Abfragen, gleichzeitig auszuführen, indem eine andere Version der betroffenen Zeilen erstellt wird. Auf diese Weise kann Connection B die Updates ohne Auswirkungen auf Connection A ausführen. Dieser Vorgang wird durch jede Zeilenversion erreicht, die einen xmin- Wert für die sichtbar ist, da Transaktion und ein xmax Wert für die bis zur Transaktion sichtbar ist. Mit MVCC ignoriert Connection A alle Änderungen, die nach dem Start der Connection A-Abfrage aufgetreten sind.
Transaktionen
Transaktionen in einem DBMS sind eine atomare Arbeitseinheit, daher wird die Transaktion entweder in ihrer Gesamtheit oder gar nicht bestätigt. Transaktionen werden auch für Parallelitätszwecke verwendet. Mit Isolationsstufen kann der Effekt, den eine Transaktion auf andere, gleichzeitige Transaktionen haben kann, definiert werden.
Sie beginnen eine Transaktion mit entweder einer BEGIN TRANSACTION oder einer START TRANSACTION. Sie führen eine Transaktion entweder mit COMMIT durch, um alle Änderungen der Transaktion zu speichern, oder mit ROLLBACK, um alle von der Transaktion vorgenommenen Änderungen rückgängig zu machen. Zum Beispiel:
BEGIN TRANSACTION;
UPDATE production.workorder
SET stockedqty=7
WHERE workorderid=1;
COMMIT;