2012-08-24 5 views
8

Considérese la siguiente consulta ejecutada en PostgreSQL 9.1 (o 9.2):¿Puede la modificación de valor simultáneo afectar la selección individual en PostgreSQL 9.1?

SELECT * FROM foo WHERE bar = true 

supongo que es una consulta bastante largo en ejecución (por ejemplo, teniendo un minuto).

Si al comienzo de la consulta hay 5 millones de registros para los que bar = true se mantiene, y durante esta consulta en otra transacción no se añaden y se eliminan en la tabla foo filas, y para algunas filas existentes se hacen cambios a la bar campo.

¿Afectará esto el resultado de la consulta de selección mostrada más arriba?

Conozco el aislamiento de las transacciones y la visibilidad entre las declaraciones separadas en una sola transacción, pero ¿qué ocurre con una declaración única que se está ejecutando?

Respuesta

10


Debido al modelo MVCC sólo tuplas que son visibles en la consulta inicio se utilizará en una sola SELECT. Los detalles en el manual here:

lectura confirmada es el nivel de aislamiento por omisión en PostgreSQL. Cuando una transacción utiliza este nivel de aislamiento, una consulta SELECT (sin una cláusula UPDATE/SHARE FOR ) ve solo datos confirmados antes de que la consulta comenzara; nunca ve datos no comprometidos ni cambios cometidos durante la ejecución de consultas por transacciones concurrentes. En efecto, una consulta SELECT ve una instantánea de la base de datos a partir del instante en que la consulta comienza a ejecutarse en . Sin embargo, SELECT ve los efectos de las actualizaciones anteriores ejecutadas dentro de su propia transacción, aunque todavía no se hayan confirmado. También tenga en cuenta que dos comandos sucesivos SELECT pueden ver datos diferentes, aunque estén dentro de una sola transacción, si otras transacciones confirman cambios durante la ejecución del primer SELECT.

Énfasis mío.

5

La consulta será una vista coherente con la lectura de los datos desde el inicio de la consulta. En Postgresql, la documentación sobre el Control de Concurrencia de Versiones Múltiples (MVCC) explica cómo se hace (existen múltiples versiones de un registro en la tabla). En Oracle, el número de cambio de secuencia (SCN) se usa junto con las "imágenes anteriores" de los datos modificados. Aquí hay un documento antiguo, Transaction Processing in Postgresql, con la sección "gestión de almacenamiento sin sobrescritura". Pero eche un vistazo a MVCC.

O lea el capítulo sobre MVCC en el documento de Postgresql

Cuestiones relacionadas