下面规则决定使用 SPI(或者任何其它 C 函数)的函数里面的数据修改的可视性:
在一个 SQL 命令执行期间,任何这个命令做的数据改变都是命令本身所看不到的。 比如,在下面命令里
INSERT INTO a SELECT * FROM a;
插入的行是 SELECT 部分看不到的
命令 C 做的修改可以被 C 之后开始的所有命令看到,不管他们是在 C 里面(在执行 C 期间)还是在 C 完成后开始的。
一个命令,如果是在一个 SQL 命令调用的函数(普通函数或者是触发器)里通过 SPI 执行的, 那么它遵循上面两个规则之一,具体哪个取决于传递给 SPI 的读/写标志。 以只读模式执行的命令遵循第一条规则:它们看不见调用它的命令做的修改。 以读写模式执行的规则遵循第二条规则:它们可以看到迄今为止所做的所有改变。
所有标准的过程语言都根据函数的易失性属性设置 SPI 读写模式。 STABLE 和 IMMUTABLE 函数是以只读模式设置的, 而 VOLATILE 函数是以读写模式设置的。虽然其它 C 函数可以违法这个规定, 但是这么做不是好事。
下一节里包含一些例子,演示了这些规则的应用。