2012-08-24 5 views
8

Betrachten Sie die folgende Abfrage in PostgreSQL ausgeführt 9.1 (oder 9.2):Kann die gleichzeitige Wertänderung Auswirkungen auf einzelne Auswahl in PostgreSQL 9.1 haben?

SELECT * FROM foo WHERE bar = true 

Angenommen, es ist eine ziemlich lange Lauf Abfrage ist (zum Beispiel eine Minute nehmen).

Wenn zu Beginn der Abfrage gibt es 5 Millionen Datensätze, für die bar = true hält, und während dieser Abfrage in einer anderen Transaktion gibt es Zeilen hinzugefügt und in der foo Tabelle entfernt, und für einige vorhandenen Zeilen werden Aktualisierungen der bar gemacht Feld.

Wirkt sich dies auf das Ergebnis der oben gezeigten Auswahlabfrage aus?

Ich weiß über Transaktionsisolation und Sichtbarkeit zwischen einzelnen Anweisungen in einer einzelnen Transaktion, aber was ist mit einer einzelnen Anweisung, die ausgeführt wird?

Antwort

10

Nr
Aufgrund des MVCC Modell nur Tupel, die bei Abfrage Start sichtbar sind, wird in einem einzigen SELECT verwendet werden. Details in der Anleitung here:

Lesen Committed ist die Standard-Isolationsstufe in PostgreSQL. Wenn eine -Transaktion diese Isolationsstufe verwendet, sieht eine SELECT-Abfrage (ohne eine FOR UPDATE/SHARE-Klausel) nur Daten, die vor Beginn der Abfrage festgeschrieben wurden. es sieht nie nicht festgeschriebene Daten oder Änderungen während Anfrage Ausführung durch gleichzeitige Transaktionen. Im Endeffekt sieht eine SELECT-Abfrage einen Snapshot der Datenbank ab dem Zeitpunkt, an dem die Abfrage zu gestartet wird. SELECT zeigt jedoch die Auswirkungen früherer Aktualisierungen in seiner eigenen Transaktion an, obwohl sie noch nicht festgeschrieben sind. Beachten Sie auch, dass zwei aufeinander folgende SELECT-Befehle unterschiedliche Daten sehen können, , obwohl sie sich innerhalb einer einzelnen Transaktion befinden, wenn andere Transaktionen Änderungen während der Ausführung des ersten SELECT festschreiben.

Schwerpunkt meiner.

5

Die Abfrage wird eine lesekonsistente Ansicht der Daten ab dem Beginn der Abfrage sein. In Postgresql wird in der Dokumentation zur Mehrfachversions-Concurrency-Steuerung (MVCC) erläutert, wie dies geschieht (mehrere Versionen eines Datensatzes sind in der Tabelle vorhanden). In Oracle wird die Sequenzänderungsnummer (Sequence Change Number, SCN) zusammen mit "Vorher-Bildern" von geänderten Daten verwendet. Hier ist ein altes Dokument, Transaction Processing in Postgresql, mit dem Abschnitt "nicht überschreiben Speicherverwaltung". Aber werfen Sie einen Blick auf MVCC.

Oder lesen Sie das Kapitel MVCC in der Postgresql doc

Verwandte Themen