Las siguientes reglas rigen la visibilidad de los cambios de datos en las funciones que utilizan SPI (o cualquier otra función C):
Durante la ejecución de un comando SQL, cualquier cambio de datos realizado por el comando es invisible para el propio comando. Por ejemplo, en:
INSERT INTO a SELECT * FROM a;
las filas insertadas son invisibles para la parte del SELECT.
Los cambios realizados por un comando C son visibles para todos los comandos que se inician después de C, sin importar si se inician dentro de C (durante la ejecución de C) o después de que C haya terminado.
Los comandos ejecutados a través de SPI dentro de una función llamada por un comando SQL (ya sea una función ordinaria o un disparador/trigger) siguen una u otra de las reglas anteriores según la bandera de lectura/escritura pasada a SPI. Los comandos ejecutados en modo de solo lectura siguen la primera regla: no pueden ver los cambios del comando invocador. Los comandos ejecutados en modo de lectura-escritura siguen la segunda regla: pueden ver todos los cambios realizados hasta el momento.
Todos los lenguajes procedimentales estándar establecen el modo de lectura-escritura de SPI
según el atributo de volatilidad de la función. Los comandos de las funciones STABLE
e IMMUTABLE se ejecutan en modo de solo lectura, mientras que los comandos de las
funciones VOLATILE se ejecutan en modo de lectura-escritura. Aunque los autores de
funciones C pueden violar esta convención, es poco probable que sea una buena idea hacerlo.
La siguiente sección contiene un ejemplo que ilustra la aplicación de estas reglas.