2009-07-22 14 views
5

Tengo una función de ejecución larga que debería insertar nuevas filas. ¿Cómo verifico el progreso de esta función?Lecturas sucias en Postgres

Estaba pensando sucia lee funcionaría así que lea http://www.postgresql.org/docs/8.4/interactive/sql-set-transaction.html y se acercó con el siguiente código y la pasó en una nueva sesión:


SET SESSION CHARACTERISTICS AS SERIALIZABLE; 

SELECT * FROM MyTable; 

Postgres me da un error de sintaxis. ¿Qué estoy haciendo mal? Si lo hago bien, ¿veré los registros insertados mientras la función larga aún se está ejecutando?

Gracias

Respuesta

10

PostgreSQL no implementa una manera para que usted vea esto desde fuera de la función, también conocido como READ UNCOMMITTED nivel de aislamiento. Sus dos opciones básicas son:

  • tienen a su disposición la función RAISE NOTICE de vez en cuando que le muestre qué tan avanzado está
  • usar algo como dblink de la función de nuevo a la misma base de datos, y actualizar una tabla de contador desde allí. Dado que se trata de una transacción completamente separada, el contador será visible tan pronto como la transacción se comprometa: no tiene que esperar a que finalice la transacción principal (alrededor de la llamada a la función).
6

PostgreSQL Transaction Isolation

En PostgreSQL, puede solicitar cualquiera de los cuatro niveles de aislamiento de transacción estándar. Pero internamente, solo hay dos niveles de aislamiento distintos, que corresponden a los niveles Read Readmitted y Serializable. Cuando selecciona el nivel Leer sin compromiso, realmente obtiene Lectura confirmada, y cuando selecciona Lectura repetible, realmente obtiene Serializable, por lo que el nivel de aislamiento real puede ser más estricto que el que seleccione. Esto está permitido por el estándar SQL: los cuatro niveles de aislamiento solo definen qué fenómenos no deben suceder, no definen qué fenómenos deben suceder.

Cuestiones relacionadas