2009-07-22 11 views
5

Ho una funzione di lunga durata che dovrebbe inserire nuove righe. Come posso controllare lo stato di avanzamento di questa funzione?Letture sporche in Postgres

pensavo sporco legge avrebbe funzionato così ho letto http://www.postgresql.org/docs/8.4/interactive/sql-set-transaction.html e si avvicinò con il seguente codice e corse in una nuova sessione:


SET SESSION CHARACTERISTICS AS SERIALIZABLE; 

SELECT * FROM MyTable; 

Postgres mi dà un errore di sintassi. Che cosa sto facendo di sbagliato? Se lo faccio bene, vedrò i record inseriti mentre quella lunga funzione è ancora in esecuzione?

Grazie

risposta

10

PostgreSQL non implementare un modo per voi di vedere questo dal di fuori della funzione, alias READ UNCOMMITTED livello di isolamento. I suoi fondamentali due opzioni sono:

  • Abbia la funzione utilizzo RAISE NOTICE ogni ora e poi visualizzare a che punto siete
  • usare qualcosa come dblink dalla funzione di nuovo allo stesso database e aggiornare una tabella contatore da li. Poiché si tratta di una transazione completamente separata, il contatore sarà visibile non appena la transazione si impegna - non è necessario attendere la conclusione della transazione principale (attorno alla chiamata della funzione).
6

PostgreSQL Transaction Isolation

In PostgreSQL, è possibile richiedere uno qualsiasi dei quattro livelli di isolamento delle transazioni standard. Ma internamente, ci sono solo due distinti livelli di isolamento, che corrispondono ai livelli Read Committed e Serializable. Quando si seleziona il livello Leggi non inviato si ottiene effettivamente Read Committed, e quando si seleziona Leggi ripetibile si ottiene realmente la serializzazione, quindi il livello di isolamento effettivo potrebbe essere più rigido di quello selezionato. Ciò è permesso dallo standard SQL: i quattro livelli di isolamento definiscono solo quali fenomeni non devono accadere, non definiscono quali fenomeni devono accadere.