44.4. 数据改变的可视性

下面规则决定使用 SPI(或者任何其它 C 函数)的函数里面的数据修改的可视性:

  • 在一个 SQL 命令执行期间,任何这个命令做的数据改变都是命令本身所看不到的。 比如,在下面命令里:

    INSERT INTO a SELECT * FROM a;
    

    插入的行是SELECT部分看不到的。

  • 命令 C 做的修改可以被 C 之后开始的所有命令看到,不管他们是在 C 里面 (在执行 C 期间)还是在 C 完成后开始的。

  • 一个命令,如果是在一个 SQL 命令调用的函数(普通函数或者是触发器)里通过 SPI 执行的, 那么它遵循上面两个规则之一,具体哪个取决于传递给 SPI 的读/写标志。 以只读模式执行的命令遵循第一条规则:它们看不见调用它的命令做的修改。 以读写模式执行的规则遵循第二条规则:它们可以看到迄今为止所做的所有改变。

  • 所有标准的过程语言都根据函数的易失性属性设置 SPI 读写模式。STABLEIMMUTABLE函数是以只读模式设置的,而VOLATILE 函数是以读写模式设置的。虽然其它 C 函数可以违反这个规定,但是这么做不是好事。

下一节里包含一些例子,演示了这些规则的应用。