2009-07-22 12 views
5

Ich habe eine lange laufende Funktion, die neue Zeilen einfügen sollte. Wie überprüfe ich den Fortschritt dieser Funktion?Dirty Reads in Postgres

ich schmutzig dachte liest funktionieren würde, so las ich http://www.postgresql.org/docs/8.4/interactive/sql-set-transaction.html und kam mit dem folgenden Code auf und lief es in einer neuen Sitzung:


SET SESSION CHARACTERISTICS AS SERIALIZABLE; 

SELECT * FROM MyTable; 

Postgres gibt mir einen Syntaxfehler. Was mache ich falsch? Wenn ich es richtig mache, sehe ich die eingefügten Datensätze, während diese lange Funktion noch läuft?

Dank

Antwort

10

PostgreSQL implementieren keine Möglichkeit für Sie, diese von außerhalb der Funktion, um zu sehen, auch bekannt als READ UNCOMMITTED Isolationsstufe. Ihre grundlegenden zwei Optionen sind:

  • Haben Sie die Funktion Gebrauch RAISE NOTICE ab und zu Ihnen zu zeigen, wie weit Sie
  • Verwendung so etwas wie dblink aus der Funktion zurück auf die gleiche Datenbank sind, und aktualisieren Sie eine Zählertabelle von dort. Da dies eine vollständig separate Transaktion ist, wird der Zähler sichtbar, sobald diese Transaktion festgeschrieben wird - Sie müssen nicht auf den Abschluss der Haupttransaktion (um den Funktionsaufruf) warten.
6

PostgreSQL Transaction Isolation

In PostgreSQL können Sie eine der vier Standardtransaktionsisolationsstufen verlangen. Aber intern gibt es nur zwei verschiedene Isolationsstufen, die den Ebenen Read Committed und Serializable entsprechen. Wenn Sie die Stufe Read Uncommitted wählen, erhalten Sie Read Committed, und wenn Sie Repeatable Read auswählen, erhalten Sie Serializable, so dass die tatsächliche Isolationsstufe strenger sein kann als die, die Sie auswählen. Dies ist durch den SQL-Standard erlaubt: Die vier Isolationsstufen definieren nur, welche Phänomene nicht auftreten dürfen, sie definieren nicht, welche Phänomene passieren müssen.

Verwandte Themen