以下规则支配使用 SPI 的函数 (或任何其他 C 函数)中数据更改的可见性:
在一条 SQL 命令的执行期间,该命令所做的任何数据更改对 命令自身是不可见的。 例如,在:
INSERT INTO a SELECT * FROM a;
中,被插入的行对
SELECT
部分是不可见的。
命令 C 所做的更改对在 C 之后开始的所有命令可见, 无论它们是在 C 内部开始(在 C 的执行期间)还是在 C 完成 之后开始。
由一条 SQL 命令(普通函数或触发器)调用的函数内部通过 SPI 执行的命令,根据传给 SPI 的读/写标志遵循上述规则之一。 以只读模式执行的命令遵循第一条规则:它们看不到调用命令的 更改。 以读写模式执行的命令遵循第二条规则:它们能看到迄今为止 做出的所有更改。
所有标准过程语言都根据函数的易变性属性设置 SPI 读/写
模式。
STABLE 和
IMMUTABLE 函数的命令以只读模式执行,
而
VOLATILE 函数的命令以读写模式执行。
虽然 C 函数的作者可以违反这一约定,但这样做不太可能是个好
主意。
下一节包含一个说明这些规则应用的示例。