2012-08-24 9 views
8

Si consideri il seguente query eseguita in PostgreSQL 9.1 (o 9.2):La modifica del valore simultaneo può influire sulla selezione singola in PostgreSQL 9.1?

SELECT * FROM foo WHERE bar = true 

Suppongo che sia una query piuttosto lungo in esecuzione (ad esempio prendere un minuto).

Se all'inizio della query ci sono 5 milioni di record per i quali bar = true detiene, e durante questo query in un'altra transazione ci sono file aggiunti e rimossi nella tabella foo, e per alcune righe esistenti aggiornamenti sono fatti per il bar campo.

Qualunque modifica influisce sul risultato della query di selezione sopra riportata?

Conosco l'isolamento delle transazioni e la visibilità tra istruzioni separate in una singola transazione, ma che ne è di una singola istruzione in esecuzione?

risposta

10

No.
causa del modello MVCC solo tuple che sono visibili a interrogazione partenza sarà utilizzato in una singola SELECT. Dettagli nel manuale here:

Read Committed è il livello di isolamento predefinito in PostgreSQL. Quando una transazione utilizza questo livello di isolamento, una query SELECT (senza una clausola UPDATE/SHARE FOR ) vede solo i dati impegnati prima dell'inizio della query; non visualizza mai dati non confermati o modifiche confermate durante l'esecuzione della query da transazioni simultanee. In effetti, una query SELECT vede un'istantanea del database dal momento in cui la query inizia a eseguita. Tuttavia, SELECT visualizza gli effetti degli aggiornamenti precedenti eseguiti all'interno della propria transazione, anche se non sono stati ancora impegnati. Si noti inoltre che due comandi SELECT successivi possono visualizzare dati diversi, anche se si trovano all'interno di una singola transazione, se altre transazioni eseguono modifiche durante l'esecuzione della prima SELECT.

Enfasi mia.

5

La query sarà una visualizzazione coerente dei dati dall'inizio della query. In Postgresql, la documentazione su Multi-Version Concurrency Control (MVCC) spiega come viene eseguita (esistono più versioni di un record nella tabella). In Oracle, viene utilizzato il numero di sequenza (SCN) insieme alle "immagini precedenti" dei dati modificati. Ecco un vecchio documento, Transaction Processing in Postgresql, con la sezione "gestione della memoria non sovrascritta". Ma dai un'occhiata a MVCC.

Oppure leggere il capitolo MVCC nel documento Postgresql

Problemi correlati